在存储过程中,我通过从常规表中选择应用程序的名称来动态创建临时表。然后我添加一个日期列并添加最近12个月。结果如下:
到目前为止一切顺利。现在我想通过查询另一个常规表来更新列中的数据。通常它会是这样的:
UPDATE ##TempTable
SET [columName] = (SELECT SUM(columName)
FROM RegularTable
WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/yyyy'))
但是,由于我不知道在任何给定时间列的名称是什么,我需要动态地执行此操作。
所以我的问题是,如何在进行更新时动态获取临时表的列名?
谢谢!
答案 0 :(得分:2)
我认为您可以使用以下内容。
select name as 'ColumnName'
from tempdb.sys.columns
where object_id = object_id('tempdb..##TempTable');
然后使用以下内容生成动态sql。
DECLARE @tableName nvarchar(50)
SET @tableName = 'RegularTable'
DECLARE @sql NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + ' UPDATE ##TempTable ' + CHAR(13) +
' SET [' + c.name + '] = (SELECT SUM([' + c.name + ']) ' + CHAR(13) +
' FROM RegularTable' + CHAR(13) +
' WHERE FORMAT(RegularTable.Date,''MM/yyyy'') = FORMAT(##TempMonths.x,''MM/yyyy''));' + CHAR(13)
from tempdb.sys.columns c
where object_id = object_id('tempdb..##MyTempTable');
print @sql
-- exec sp_executesql @sql;
然后上面代码段中的print
语句显示@sql
变量的内容如下。
UPDATE ##TempTable
SET [Test Application One] = (SELECT SUM([Test Application One])
FROM RegularTable
WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/yyyy'));
UPDATE ##TempTable
SET [Test Application Two] = (SELECT SUM([Test Application Two])
FROM RegularTable
WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/yyyy'));
现在,您使用sp_exec
执行更新,如下所示(从上面的代码段取消注释)。
exec sp_executesql @sql;
如果是1次UPDATE
,您可以PRINT
动态SQL语句(如上所示),然后在SSMS Query Windows中执行它。
我建议您先使用print
语句确保生成的UPDATE
语句符合您的要求,然后执行sp_executesql
或运行打印的UPDATE
语句在查询窗口中。