Sql 使用变量作为列名

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

我这里的问题是如何在select语句中使用变量作为列名。我已经将变量@B创建为一个列名,即bgnade1到bgnade12。我没有使用12条select语句,而是创建了一个while循环。列名基本上是BGNDATE+递增的整数

我得到的错误是:

将varchar值“bgnade1”转换为数据类型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时,因为@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
...