2013-09-26 3 views
1

Мой вопрос здесь в том, как использовать переменную для имени столбца в предложении select. Я создал переменную @B как имя столбца с BGNDATE1 через BGNDATE12. Вместо того, чтобы иметь 12 операторов выбора, я создал цикл while. Имя столбца - это в основном BGNDATE + инкрементированное целое число.Использование переменной в качестве имени столбца

Ошибка я получаю:

Конверсия удалось при преобразовании значения VARCHAR «BGNDATE1» для типа данных Int.

USE X --this is the database  
DECLARE @DATES TABLE (ROWID INT, FISCDATES INT) 

    DECLARE @FY INT = 2012 
    DECLARE @I INT 
    DECLARE @IV VARCHAR(2) 
    DECLARE @B VARCHAR(9) 

    SELECT @FY AS FY 
    SET @I = 1 
    WHILE @I <= 12 
    BEGIN 
    SET @IV = @I 
    SET @B = 'BGNDATE' + @IV 

    INSERT INTO @DATES (ROWID) 
    SELECT @I 

    MERGE INTO @DATES AS T 
    USING (

--This где ошибка по отношению к переменной @B

SELECT @B AS FISCDATES FROM DBO.Y -- Y is the table in the database 
    WHERE FSCYEAR = @FY) AS S 
ON T.ROWID = @I 
WHEN MATCHED 
    THEN UPDATE 
    SET T.FISCDATES = S.FISCDATES; 

SET @I = @I + 1 
END 

SELECT * FROM @DATES 
+0

Для этого вам понадобится динамический SQL-запрос. Проверьте это: http://technet.microsoft.com/en-us/library/ms188001.aspx – cha

+0

Я бы постарался избежать динамического SQL:> Он просто становится беспорядочным и беспорядочным. Попытайтесь исправить схему - конечно, поскольку это, вероятно, невозможно по какой-то глупой причине, [* используйте UNPIVOT для исправления/нормализации данных *] (http://weblogs.sqlteam.com/jeffs/archive/2008/ 04/23/unpivot.aspx) на сайте использования (UNPIVOT во всех столбцах «BGNDATEx») и используйте результат * normalized * для более безопасной работы с этой операцией. – user2246674

ответ

0

Вы не можете использовать переменную в качестве имени столбца (если вы не создадите весь запрос динамически), но вы можете использовать переменную для выбора из разных столбцов:

... 
SELECT 
    CASE @IV 
    WHEN 1 THEN BGNDATE1 
    WHEN 2 THEN BGNDATE2 
    WHEN 3 THEN BGNDATE3 
    WHEN 4 THEN BGNDATE4 
    WHEN 5 THEN BGNDATE5 
    WHEN 6 THEN BGNDATE6 
    WHEN 7 THEN BGNDATE7 
    WHEN 8 THEN BGNDATE8 
    WHEN 9 THEN BGNDATE9 
    WHEN 10 THEN BGNDATE10 
    WHEN 11 THEN BGNDATE11 
    WHEN 12 THEN BGNDATE12 
    END AS FISCDATES FROM DBO.Y 
... 
+0

Хотя я согласен с тем, что вряд ли оптимальная практика, этот метод легко понять и из-за конечного числа переменных является хорошим решением. –

0

При выборе @B, что не будет работать, потому что @B не имя столбца, это Переменная.

Лучше всего денормализовать таблицу, чтобы вместо 12 столбцов с именем BGNDATE с 1 по 12 у вас была другая таблица, к которой нужно было присоединиться.

Если вы не можете сделать это, сделать это с динамическим SQL:

exec('MERGE INTO @DATES AS T 
    USING ( 
SELECT ' + @B + ' AS FISCDATES FROM DBO.Y 
    WHERE FSCYEAR = @FY) AS S 
ON T.ROWID = @I 
WHEN MATCHED 
    THEN UPDATE 
    SET T.FISCDATES = S.FISCDATES;') 
Смежные вопросы