如何将exec结果分配给多个sql变量?

时间:2019-10-10 08:15:20

标签: sql sql-server tsql stored-procedures

在SSMS中执行名为[s_sspCallSharePointWebService]的存储过程后,我得到了返回的数据

DECLARE @sWebAddr AS NVARCHAR(MAX),
        @bAPISuccess AS NVARCHAR(10),
        @objSharePointXML AS XML

SET @sWebAddr = 'http://...'

EXEC [s_sspCallSharePointWebService] @sWebAddr, @bAPISuccess OUTPUT, @objSharePointXML OUTPUT

我想知道如何保存 变量中的数据,而不是返回下面的表。

---------------------------------------
| (No column name) | (No column name) |
---------------------------------------
| True             | <XMLRoot>....    |
---------------------------------------

此外,由于在EXEC sp_OAGetProperty @objecttoken, 'responseText'中有[s_sspCallSharePointWebService]的结果,然后已经将响应文本插入到临时表中,因此无法在此处将数据插入临时表中。

那会导致错误:

  

不能嵌套INSERT EXEC语句

2 个答案:

答案 0 :(得分:0)

(对我来说)这很丑陋,但这可以使用临时表来完成。临时表对当前作用域中的所有例程可见。

因此,您可以像这样嵌套:

EXEC SP1
     ...
     EXEC SP2
     ...
        EXEC SP3
        ...

假设EXEC SP2返回执行SELECT语句的行集。那么,问题是如何实现它?

CREATE PROCEDURE dbo.SP1
AS
BEGIN;

    SELECT 'SP1' AS [Caller];

    EXEC dbo.SP2; 

END;

GO

CREATE PROCEDURE dbo.SP2
AS
BEGIN;

    SELECT 'SP2' AS [Caller];

    INSERT INTO #TEST 
    SELECT 1;

END;

GO


CREATE TABLE #TEST
(
    [ID] INT
);

EXEC dbo.SP1;

SELECT *
FROM #TEST;

此想法是在外部范围内创建临时表,并执行该过程以确保已创建此表并填充该表。然后,使用初始调用方中的表。

对我来说这很丑陋,因为如果未定义此表,则例程将导致错误:

  

消息208,级别16,状态0,过程dbo.SP2,行8 [批处理开始   第0行]无效的对象名称“ #TEST”。

,在某些情况下可能很难调试。

答案 1 :(得分:0)

您可以只使用一个表变量,然后从中进行SELECT分配,而不是这样做。这是一个带有简单proc并返回一行的示例:

USE tempdb;
GO

CREATE OR ALTER PROC dbo.ReturnsOneRow
AS
BEGIN
    SELECT 1 AS FirstColumn, 'Hello' AS SecondColumn, 4 AS ThirdColumn;
END;
GO

EXEC dbo.ReturnsOneRow;
GO

DECLARE @FirstColumn int;
DECLARE @SecondColumn varchar(20);
DECLARE @ThirdColumn int;

DECLARE @Row TABLE
(
    FirstColumn int,
    SecondColumn varchar(20),
    ThirdColumn int
);

INSERT @Row 
(
    FirstColumn, SecondColumn, ThirdColumn
)
EXEC dbo.ReturnsOneRow;

SELECT TOP(1) @FirstColumn = r.FirstColumn,
              @SecondColumn = r.SecondColumn,
              @ThirdColumn = r.ThirdColumn
FROM @Row AS r;

-- Check the values

SELECT @FirstColumn, @SecondColumn, @ThirdColumn;

在这种情况下,表变量将比临时表好得多,并且您在其他位置的可见性也没有问题,也不必清理它(批处理结束时就没有了)。