Sql 使用变量作为列名
我这里的问题是如何在select语句中使用变量作为列名。我已经将变量@B创建为一个列名,即bgnade1到bgnade12。我没有使用12条select语句,而是创建了一个while循环。列名基本上是BGNDATE+递增的整数 我得到的错误是: 将varchar值“bgnade1”转换为数据类型int时,转换失败Sql 使用变量作为列名,sql,sql-server,tsql,Sql,Sql Server,Tsql,我这里的问题是如何在select语句中使用变量作为列名。我已经将变量@B创建为一个列名,即bgnade1到bgnade12。我没有使用12条select语句,而是创建了一个while循环。列名基本上是BGNDATE+递增的整数 我得到的错误是: 将varchar值“bgnade1”转换为数据类型int时,转换失败 USE X --this is the database DECLARE @DATES TABLE (ROWID INT, FISCDATES INT) DECLAR
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时,因为@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;')
不能将变量用作列名(除非动态创建整个查询),但可以使用变量从不同的列中进行选择:
...
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
...
您需要为此使用动态SQL查询。检查这个:我会尽量避免动态SQL:>它会变得越来越混乱。尝试修复模式-当然,由于某些愚蠢的原因,这可能是不可能的,在使用站点(在所有“BGNDATEx”列中取消PIVOT),并使用规范化结果更理智地处理操作。虽然我同意取消PIVOT可能是最佳实践,这种方法易于理解,由于变量数量有限,是一种很好的解决方案。
...
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
...