Мой вопрос здесь в том, как использовать переменную для имени столбца в предложении 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
Для этого вам понадобится динамический SQL-запрос. Проверьте это: http://technet.microsoft.com/en-us/library/ms188001.aspx – cha
Я бы постарался избежать динамического SQL:> Он просто становится беспорядочным и беспорядочным. Попытайтесь исправить схему - конечно, поскольку это, вероятно, невозможно по какой-то глупой причине, [* используйте UNPIVOT для исправления/нормализации данных *] (http://weblogs.sqlteam.com/jeffs/archive/2008/ 04/23/unpivot.aspx) на сайте использования (UNPIVOT во всех столбцах «BGNDATEx») и используйте результат * normalized * для более безопасной работы с этой операцией. – user2246674