Как я могу назначить результат exec нескольким переменным sql? - PullRequest
0 голосов
/ 10 октября 2019

Я получил возвращенные данные после выполнения хранимой процедуры с именем [s_sspCallSharePointWebService] в SSMS

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 голосов
/ 10 октября 2019

Вместо этого вы можете просто использовать табличную переменную, а затем ВЫБРАТЬ из нее для назначения. Вот пример с простой процедурой, которая возвращает одну строку:

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;

В этой ситуации переменная таблицы будет намного лучше, чем временная таблица, и у вас нет проблем с ее видимостью в других местах, илинеобходимо очистить его (оно ушло в конце партии).

0 голосов
/ 10 октября 2019

Это очень некрасиво (для меня), но это можно сделать с помощью временных таблиц. Временная таблица видна всем подпрограммам в текущей области.

Таким образом, вы можете иметь вложение следующим образом:

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[Batch Start Line 0] Недопустимое имя объекта '#TEST'.

, и в некоторых случаях отладка может быть затруднена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...