使用变量作为列名

时间:2013-09-26 00:47:01

标签: sql sql-server tsql

我的问题是如何在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

2 个答案:

答案 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;')

答案 1 :(得分: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
...
相关问题