sp_execute_remote 只输出一个结果集?

问题描述 投票:0回答:1

我在 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 azure-sql-database
1个回答
0
投票

您看到的行为是记录的行为。从结果集部分:

结果集

返回第一个 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 = ....

但是,如果结果集不同,那么您将需要将单独的进程分成各自的进程,并单独执行每个进程。

© www.soinside.com 2019 - 2024. All rights reserved.