12

我正在 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”。

如您所见,该变量已声明。我已经阅读了文档,似乎只允许使用 text、ntext 和 image 参数。我怎样才能拥有我需要的东西?

PS:我发现了许多关于 2008 年和更高版本的提示,包括 2005 年的任何提示。

4

3 回答 3

11

已解决,感谢大家的提示:

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
于 2013-08-29T15:55:26.217 回答
6

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;
于 2019-03-28T09:46:02.673 回答
1

@tempTable 的范围仅限于当前过程。

您可以将@tempTable 替换为全局临时表(即## 表),但要非常小心该表的范围,并确保在过程结束时将其删除

于 2013-08-29T15:50:24.473 回答