2013-07-19 129 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.

相关问题