2013-09-26 48 views
1

我的問題在這裏是如何使用變量作爲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 
+0

您需要爲此使用動態SQL查詢。檢查此:http://technet.microsoft.com/en-us/library/ms188001.aspx – cha

+0

我會盡量避免動態SQL:>它只會變得更加混亂和混亂。嘗試修復架構 - 當然,因爲這可能不可能出於某些愚蠢的原因,[*使用UNPIVOT修復/規範化數據*](http://weblogs.sqlteam.com/jeffs/archive/2008/ 04/23/unpivot.aspx)(在所有「BGNDATEx」列中使用UNPIVOT),並使用* normalized *結果更加理智地處理操作。 – user2246674

回答

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 
... 
+0

儘管我同意unpivot可能是最佳實踐,但這種方法很容易理解,並且由於變量的數量有限,這是一個很好的解決方案。 –

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