我在 Azure SQL 数据库中创建了一个存储过程,它执行以下操作:
CREATE PROCEDURE [dbo].[DoSomething](@Script NVARCHAR(MAX))
AS
BEGIN
EXEC (@Script)
END
在另一个 Azure SQL 数据库中,我创建了一个指向此数据库的外部数据源,然后运行该过程
EXEC sp_execute_remote @datasource,
N'EXEC [dbo].[DoSomething] @Script',
N'@Script NVARCHAR(MAX)',
@Script = ....
该脚本可以包含我想要远程执行的各种不同的脚本。一个例子是
SELECT <some columns> FROM <somewhere>
SELECT <different columns> FROM <somewhereelse>
当我直接通过 SSMS 在目标数据库上运行脚本时,“当然”我得到了两个结果集。
但是,当我使用
sp_execute_remote
通过存储过程运行脚本时,我只能在 SSMS 的输出网格中看到第一个结果集。
这里的脚本似乎不是问题。当我将脚本简化为其基本要素时,也会发生同样的事情:
SELECT 'hello world 1'
SELECT 'hello world 2'
我在 SSMS 的输出网格中看到的唯一东西是
hello world 1
。
我还能够确认这两个
SELECT
语句实际上都被执行了。我使用表变量做到了这一点
DECLARE @outputtable TABLE ([output] NVARCHAR(100))
INSERT INTO @outputtable
EXEC ('SELECT ''hello world 1''')
INSERT INTO @outputtable
EXEC ('SELECT ''hello world 2''')
SELECT * FROM @outputtable
现在它显示两个输出。
但是,当然,在现实生活中事情并没有那么简单。在现实生活中,脚本可能会输出许多结果集,每个结果集的列都非常不同。
问题:我可以采取什么措施来确保所有结果集都返回到 SSMS 输出网格?
结果集
返回第一个 T-SQL 语句的结果集。
因此,如果您的过程返回许多结果集,则无论您使用什么客户端工具,您都只会看到第一个结果集;该问题与 SSMS 无关。
如果该过程返回具有相同定义的数据集,您可以
CREATE
一个(临时)表,INSERT
将数据放入其中,然后SELECT
从中取出。比如:
DECLARE @stmt nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @stmt = N'CREATE TABLE #ProcResults (Col1 varchar(10),' + @CRLF +
N' ...
N' Col10 int);' + @CRLF +
N'INSERT INTO #Procresults (Col1, ..., Col10)' + @CRLF +
N'EXEC [dbo].[DoSomething] @Script;' + @CRLF +
N'SELECT * FROM #ProcResults;';
EXEC sp_execute_remote @datasource,
@stmt,
N'@Script NVARCHAR(MAX)',
@Script = ....
但是,如果结果集不同,那么您将需要将单独的进程分成各自的进程,并单独执行每个进程。