更新SQL Server临时表中列名未知的数据
在存储过程中,我通过从常规表中选择应用程序的名称来动态创建临时表。然后我添加一个日期列并添加最后12个月。结果如下所示: 到目前为止还不错。现在我想通过查询另一个常规表来更新列中的数据。通常是这样的:更新SQL Server临时表中列名未知的数据,sql,sql-server,stored-procedures,temp-tables,Sql,Sql Server,Stored Procedures,Temp Tables,在存储过程中,我通过从常规表中选择应用程序的名称来动态创建临时表。然后我添加一个日期列并添加最后12个月。结果如下所示: 到目前为止还不错。现在我想通过查询另一个常规表来更新列中的数据。通常是这样的: UPDATE ##TempTable SET [columName] = (SELECT SUM(columName) FROM RegularTable WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/
UPDATE ##TempTable
SET [columName] = (SELECT SUM(columName)
FROM RegularTable
WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/yyyy'))
但是,由于我不知道在任何给定时间列的名称,所以我需要动态地执行此操作
所以我的问题是,如何在执行更新时动态获取临时表的列名
谢谢 我想你可以用下面的方法
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
执行如下更新(从上面的代码片段中取消注释)
如果是一次更新
,您可以打印
动态SQL语句(如上所示),然后在SSMS查询窗口中执行它
我建议您首先使用
print
语句,以确保生成的UPDATE
语句符合您的要求,然后执行sp\u executesql
或在查询窗口中运行打印的UPDATE
语句。谢谢,这非常适合获取名称。现在我需要弄清楚进行更新的语法。所有需要更新的动态列都在RegularTable
表中吗?谢谢,做一些修改,但是语法确实帮助了我。对不起,还需要一分才能投票赞成。>_
exec sp_executesql @sql;