Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新SQL Server临时表中列名未知的数据_Sql_Sql Server_Stored Procedures_Temp Tables - Fatal编程技术网

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

更新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/

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

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

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;