Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.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 - Fatal编程技术网

sql server-动态填充临时表中已执行查询字符串的结果

sql server-动态填充临时表中已执行查询字符串的结果,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我正在写一个存储过程。我有一个包含sql查询的字符串。例如: DECLARE @sql nvarchar(max) SET @sql = (N'SELECT pkOrderID FROM Orders') 请注意:这不是select语句的样子。这只是我想要执行字符串并将结果放入一个临时表(例如,tentable)的一个示例。我知道EXEC@sql存在,但不确定在这种情况下它是否对我有好处。另一个问题是,我不知道返回的@sql中所有列的名称,因此需要根据@sql的返回动态创建temp表tent

我正在写一个存储过程。我有一个包含sql查询的字符串。例如:

DECLARE @sql nvarchar(max)
SET @sql = (N'SELECT pkOrderID FROM Orders') 
请注意:这不是select语句的样子。这只是我想要执行字符串并将结果放入一个临时表(例如,tentable)的一个示例。我知道EXEC@sql存在,但不确定在这种情况下它是否对我有好处。另一个问题是,我不知道返回的@sql中所有列的名称,因此需要根据@sql的返回动态创建temp表tentable。谢谢你的帮助

我认为您可以使用SELECT INTO来做您想做的事情,但这意味着更新您的字符串:

DECLARE @sql nvarchar(max)
SET @sql = (N'SELECT frompkOrderID INTO #tmporders FROM Orders') 
然后您应该能够运行EXEC@sql来创建表


有关在此处选择的更多信息:

没有简单的方法可以做到这一点。@JanR解决方案的问题是,tmporders表将超出调用存储过程的脚本的作用域,即它将产生一个错误,如无效的对象名“rtmporders”

一种替代方法是使用全局临时表,例如tmporders

因此,您的SP可能如下所示:

CREATE PROCEDURE TestSP 
AS
BEGIN
  SELECT pkOrderID  INTO ##tmporders FROM Orders
END
GO
调用脚本可能如下所示:

EXEC TestSP
SELECT * FROM ##temporders

有没有一种方法可以让我这样做,而不必创建可诱惑的结构,并且动态地让它根据@sqlSelect-Into返回的内容创建列,这将基于结果创建表,假设它不存在。我会给我的回答添加一个参考。我刚刚遇到了超出范围的问题。当我尝试将表放在sp的末尾时,让我尝试一下这个方法,并使用drop table Attentiable。它说不能删除,因为它不存在或者我没有权限。我猜它认为它不存在,但它确实存在,因为它正确地执行了string语句……当创建表的会话结束时,以及任何其他引用该表的TSQL完成时,全局临时表都会自动删除。