2014-10-27 60 views
0

我在写存储过程。我有一个字符串,其中包含一个SQL查询。例如:SQL服务器 - 从执行的查询字符串在临时表中动态填充结果

DECLARE @sql nvarchar(max) 
SET @sql = (N'SELECT pkOrderID FROM Orders') 

(只是要注意:这不是select语句看起来这只是我的意思为例)然后,我想执行的字符串,并把结果在一个临时表例如#tempTable。我知道EXEC(@sql)存在,但不知道在这种情况下它是否会对我有好处。另一个问题是,我不知道返回的@sql中所有列的名称,所以临时表#tempTable需要基于@sql的返回而创建。谢谢你的帮助。

回答

1

有没有简单的方法来做到这一点。 @ JanR解决方案的问题在于#tmporders表超出了调用存储过程的脚本的范围(即它会产生一个错误,如“无效的对象名'#rtmporders'”

一种替代方法是。使用全局临时表(如## tmporders)

所以你的SP可能是这样的:

CREATE PROCEDURE TestSP 
AS 
BEGIN 
    SELECT pkOrderID INTO ##tmporders FROM Orders 
END 
GO 

并调用脚本可能是这样的:

EXEC TestSP 
SELECT * FROM ##temporders 
+0

雅我刚碰到超出范围问题。让我试一试 – frontin 2014-10-27 00:58:03

+0

当我尝试使用DROP TABLE ## tempTable在sp的末尾删除表时。它说不能下降,因为它不存在或我没有权限。我猜它认为它不存在,但它的确如此,因为它正确地执行了字符串语句...... – frontin 2014-10-27 01:26:04

+0

创建表的会话结束时,全局临时表(## table)会自动删除,并且每当任何其他TSQL引用该表已完成。 – JohnS 2014-10-27 01:58:09

1

我认为你可以使用SELECT INTO做你想要什么,但它意味着更新您的字符串:

DECLARE @sql nvarchar(max) 
SET @sql = (N'SELECT frompkOrderID INTO #tmporders FROM Orders') 

,那么你应该能够运行EXEC @sql创建表

更多信息关于SELECT INTO这里:http://msdn.microsoft.com/en-au/library/ms188029.aspx

+0

是否有办法我做这件事s没有创建tempTable的结构并动态地让它创建基于从@sql返回的whats的列 – frontin 2014-10-27 00:21:22

+0

Select Into将根据结果创建表(假定它尚不存在)。将添加一个参考我的回答 – JanR 2014-10-27 00:25:44

+0

感谢您的帮助人。 :) – frontin 2014-10-27 00:36:00