2

我的问题是如何在 select 语句中使用变量作为列名。我创建了变量@B 作为列名,即 BGNDATE1 到 BGNDATE12。我创建了一个 while 循环,而不是 12 个选择语句。列名基本上是 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
4

2 回答 2

1

您不能使用变量作为列名(除非您动态创建整个查询),但您可以使用变量从不同的列中进行选择:

...
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
...
于 2013-09-26T01:05:36.113 回答
0

当您选择由于@B 不是列名而不起作用的@B 时,它是一个变量。

最好对表进行非规范化,这样您就可以加入另一个表,而不是使用名为 BGNDATE 1 到 12 的 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;')
于 2013-09-26T01:02:12.063 回答