我的问题在这里是如何使用变量作为select语句中的列名称。我已经创建了变量@B作为BGNDATE1到BGNDATE12的列名。我创建了一个while循环,而不是有12个select语句。列名基本上是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 (
- 这是在错误是关于变量@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)(在所有“BGNDATEx”列中使用UNPIVOT),并使用* normalized *结果更加理智地处理操作。 – user2246674