更新列名未知的SQL Server临时表中的数据

时间:2013-12-26 19:37:10

标签: sql sql-server stored-procedures temp-tables

在存储过程中,我通过从常规表中选择应用程序的名称来动态创建临时表。然后我添加一个日期列并添加最近12个月。结果如下:

Two dynamic columns and one date column.

到目前为止一切顺利。现在我想通过查询另一个常规表来更新列中的数据。通常它会是这样的:

UPDATE ##TempTable
SET [columName] = (SELECT SUM(columName)
FROM RegularTable
WHERE FORMAT(RegularTable.Date,'MM/yyyy') = FORMAT(##TempMonths.x,'MM/yyyy'))

但是,由于我不知道在任何给定时间列的名称是什么,我需要动态地执行此操作。

所以我的问题是,如何在进行更新时动态获取临时表的列名?

谢谢!

1 个答案:

答案 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语句在查询窗口中。