我正在SQL Server 2005中编写存储过程,在给定点我需要执行另一个存储过程。这个调用是动态的,所以我像往常一样使用sp_executesql命令:
DECLARE @DBName varchar(255)
DECLARE @q varchar(max)
DECLARE @tempTable table(myParam1 int, -- other params)
SET @DBName = 'my_db_name'
SET q = 'insert into @tempTable exec ['+@DBName+'].[dbo].[my_procedure]'
EXEC sp_executesql @q, '@tempTable table OUTPUT', @tempTable OUTPUT
SELECT * FROM @tempTable
但是我收到了这个错误:
必须声明标量变量“@tempTable”。
正如您所看到的那样,声明了变量。我已经阅读了documentation,似乎只允许参数是text,ntext和image。我怎样才能得到我需要的东西?
PS:我已经找到了许多关于2008年和更多版本的提示,2005年都有。
答案 0 :(得分:6)
已解决,感谢所有提示:
DECLARE @DBName varchar(255)
DECLARE @q varchar(max)
CREATE table #tempTable(myParam1 int, -- other params)
SET @DBName = 'my_db_name'
SET @q = 'insert into #tempTable exec ['+@DBName+'].[dbo].[my_procedure]'
EXEC(@q)
SELECT * FROM #tempTable
drop table #tempTable
答案 1 :(得分:1)
@ tempTable的范围仅限于当前程序。
您可以将@tempTable替换为全局临时表(即## table),但要非常小心该表的范围,并确保在过程结束时删除它
答案 2 :(得分:0)
SQL Server 2005允许使用INSERT INTO EXEC操作(https://docs.microsoft.com/en-us/sql/t-sql/statements/insert-transact-sql?view=sqlallproducts-allversions)。
您可以创建一个表值变量,并将存储过程的结果插入该表中:
DECLARE @tempTable table(myParam1 int, myParam2 int);
DECLARE @statement nvarchar(max) = 'SELECT 1,2';
INSERT INTO @tempTable EXEC sp_executesql @statement;
SELECT * FROM @tempTable;
结果:
myParam1 myParam2
----------- -----------
1 2
或者您可以使用任何其他自己的存储过程:
DECLARE @tempTable table(myParam1 int, myParam2 int);
DECLARE @statement nvarchar(max) = 'SELECT 1,2';
INSERT INTO @tempTable EXEC [dbo].[my_procedure];
SELECT * FROM @tempTable;