2013-07-19 126 views
2

我有一個數據表,其中列出了12個週期列的值。我試圖在本月初將前幾個月的數據清零,但未成功。我的查詢的第一部分返回列名稱,然後我想將它傳遞到Update語句,但那是一切都出錯了?請幫助*是否可以將變量列名傳遞給更新語句?

DECLARE @A VARCHAR(20) = (SELECT listofperiod FROM [periods] P 
          INNER JOIN (SELECT monthofyear 
          FROM ref_calender RC 
          WHERE RC.date = Dateadd(m,-1,CONVERT(DATE,Getdate()))) 
          RC ON P.monthofyear = RC.monthofyear) 

UPDATE FD SET @A = 0 
     FROM [test_table] FD 
     INNER JOIN [glx]AG ON FD.company = AG.company 
     AND FD.acctnum = AG.account_id ' 
+2

N O;您無法通過查詢的變量/參數選擇要更新的列。而架構錯誤設計的原因之一是因爲設計使得查詢或更新特定月份的數據變得困難。 –

回答

3

你將不得不使用動態SQL來實現這一目標:

DECLARE @sql NVARCHAR(MAX) 

SET @sql = 'UPDATE FD 
      SET ' + @A + '= 0 
      FROM [test_table] FD 
      INNER JOIN [accpac_glx]AG 
        ON FD.company = AG.company 
         AND FD.acctnum = AG.account_id' 

EXEC (@sql) 
3

你可以用多個條件set語句做到這一點:

UPDATE FD 
SET Period1 = (case when @A = 'Period1' then 0 else Period1 end), 
     Period2 = (case when @A = 'Period2' then 0 else Period2 end), 
     Period3 = (case when @A = 'Period3' then 0 else Period3 end), 
     Period4 = (case when @A = 'Period4' then 0 else Period4 end) 
FROM [test_table] FD 
     INNER JOIN [glx]AG 
       ON FD.company = AG.company 
        AND FD.acctnum = AG.account_id 

也就是說,設置該值爲當前值,除非該標誌(@A)表示將該值重置爲0.

相關問題