Используйте @variable в имени столбца в SQL SERVER 2012

#sql #sql-server #loops

#sql #sql-сервер #циклы

Вопрос:

Здесь я использовал функцию SUM для столбца TRx1. У меня есть TRx2, 3, 4, .. 53 столбца в таблице. Я хочу отобразить все столбцы с помощью цикла.

 DECLARE @flag INT;
SET @flag = 1;

WHILE @flag <= 2
BEGIN

     select TOP 5 sd.OutletBPID, md.Product, SUM(TRx1)
     from sdata as sd, md, oa
     where sd.PSetID = md.PsetID
     group by sd.OutletBPID, md.Product;

SET @flag = @flag   1;
END;
  

Следующий код, который я сделал, но он показывает ошибку: «Недопустимое имя столбца»

 DECLARE @flag INT;
SET @flag = 1;

WHILE @flag <= 2
BEGIN

     select TOP 5 sd.OutletBPID, md.Product, SUM(TRx@flag)
     from sdata as sd, md, oa
     where sd.PSetID = md.PsetID
     group by sd.OutletBPID, md.Product;

SET @flag = @flag   1;
END;
  

Комментарии:

1. Есть ли причина для plsql тега?

2. Цикл @WilliamRobertson находится под тегом plsql, верно?

3. Не совсем. Щелкните тег для определения.

4. ТЕГ @WilliamRobertson УДАЛЕН.

Ответ №1:

Вам нужен динамический sql

 DECLARE @flag INT,
        @sql varchar(8000)=''
SET @flag = 1;


WHILE @flag <= 2
BEGIN

SET @sql = 'select TOP 5 sd.OutletBPID, md.Product, SUM(TRx' cast(@flag as varchar(20)) ')
            from sdata as sd, md, oa
            where sd.PSetID = md.PsetID
            group by sd.OutletBPID, md.Product'

    exec (@sql)

SET @flag = @flag   1;
END;
  

Комментарии:

1. Спасибо, это работает. exec (‘выберите 5 ЛУЧШИХ sd.OutletBPID, md.Product, SUM(TRx’ @flag ‘) как TotalTRx’ @flag ‘ из sdata как sd, md, oa, где sd. PSetID = md.Группа идентификаторов PsetID по sd. OutletBPID, md.Product’)

2. Невозможно выполнить ПРИВЕДЕНИЕ () внутри EXEC() таким образом.

3. @AaronBertrand — да, пропустил это. Обновил мой ответ