MSTSQL: может ли SP возвращать как выходной параметр, так и набор результатов - PullRequest
0 голосов
/ 08 февраля 2019

Я хотел бы знать, возможно ли, чтобы хранимая процедура TSQL возвращала как набор результатов, так и выходной параметр, вот так.

create procedure uspReadMyXmlInformation(@myXmlDoc xml, @myProductNum varchar(18) output) as
    begin
        set nocount on;

        declare @myXmlContent table(MyOrderId varchar(12) not null
                                   ,CreatedAt datetime not null)

        insert into @myXmlContent
            select x.c.value('MyOrderID[1]', 'varchar(12)')
                    x.c.value('CreatedAt[1]', 'datetime')
                from @myXmlDoc.nodes('MyRootNodeName/MyChildNodeName') x(c)

        set @myProductNum='MyProductNum'

        select *
            from @myXmlContent

        return;
    end

Итак, здесь я могу либо получить результатустановить, когда я удаляю выходной параметр, или я получаю выходной параметр, и набор результатов всегда пуст (0=count(*)).

В любом случае я могу получить оба с одной и той же хранимой процедурой, или я былучше разделить их?

Я думаю, что это выполнимо из этого поста в Oracle.Я хотел бы добиться того же в SQL Server, хотя и ограничен версией 2008.

Хранимая процедура Oracle: возвращать как набор результатов, так и параметры

Что яНапример, использование одного и того же SP заключается в том, что и результирующий набор, и выходной параметр представляют информацию, которую я прочитал из XML-документа.Итак, имя SP говорит само за себя, так или иначе.

РЕДАКТИРОВАТЬ

Как некоторые думают, это может быть дубликатом:

Можно вернуть параметр out с помощью DataReader

Я не думаю, что это связано с тем, что ответы связаны с тем, как DataReader ведет себя более эффективно, чем с помощью TSQL.

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

Итак, я использую SQLСервер только проект, и мне это нужно.В противном случае я разделю его на две части, если не смогу своевременно добиться этого.

Вот как это используется:

declare @xmlInformationData table(MyOrderId varchar(12) not null
                                  ,CreatedAt datetime not null)
insert into @xmlInformationData
    execute uspReadMyXmlInformation @myXmlDoc, @myProductNum output

while 0<(select count(*) from @xmlInformationData)
    begin
        -- This will never be executed because I have no rows in @xmlInformationData
        -- And yet, before the loop, I have my out param value!
    end

1 Ответ

0 голосов
/ 10 февраля 2019

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

create procedure Arthur( @TheAnswer as Int Output ) as
  begin

  -- Set the value of the output parameter.
  set @TheAnswer = 42;

  -- Generate a single row most of the time.
  select GetDate() as NextVogonPoetryReading
    where DatePart( millisecond, GetDate() ) < 750;

  end;
go 1

-- Declare the variables for the test.
declare @HHGTTU as Table ( HHGTTUId Int Identity, NextVogonPoetryReading DateTime );
declare @SixTimesNine as Int;

-- Execute the SP once so that the   while   loop might.
insert into @HHGTTU ( NextVogonPoetryReading )
  execute Arthur @TheAnswer = @SixTimesNine Output;

-- See what happens.
while exists ( select Pi() from @HHGTTU )
  begin
  -- See where we are at.
  select @SixTimesNine as SixTimesNine, Max( HHGTTUId ) as MaxHHGTTUId, Max( NextVogonPoetryReading ) as MaxNextVogonPoetryReading
    from @HHGTTU;
  -- Reset.
  delete from @HHGTTU;
  set @SixTimesNine = 54;
  select @SixTimesNine as SixTimesNineAfterReset;
  waitfor delay '00:00:00.100';
  -- Execute the SP again.
  insert into @HHGTTU ( NextVogonPoetryReading )
    execute Arthur @TheAnswer = @SixTimesNine Output;
  end;

За исключением: мои извинения за травму, внесенную в вашу жизнь, когда я упомянул о DataReader.Я просто пытался передать свой опыт работы с приложением C #, не вдаваясь в подробности того, какой именно тип соединения с базой данных вы используете, какие драйверы могут быть задействованы, ....

...