Выбор выходов хранимых процедур на лету (SQL Server) - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь передать выходной параметр из хранимой процедуры в другую хранимую процедуру. Родитель должен передать параметр дочернему элементу.

Могу ли я вернуть результат на лету в операторе выбора, подобном этому?

Если нет, как можно решить эту проблему?

Хранимая процедура (дочерняя)

@uid int,
@result nvarchar(max) output

as

begin select @result = stuff((
  select 
  'cid' = cid

  from db

  for xml path('')
  ), 
  1, 
  1, 
  '<'
)

return

end

Хранимая процедура (родительская)

 select
 'id'         = uid,
 'result'     = (exec db.dbo.table uid, @result output) 
 from table 

Здесь я пытаюсь передать uid из родительского оператора select, передать его в другую хранимую процедуру и вернуть результат в select.

1 Ответ

0 голосов
/ 04 мая 2018

Это может быть то, что вам нужно, однако тот факт, что у вас есть EXEC утверждение в вашем SELECT, заставляет меня думать иначе.

CREATE PROC Child @uid int, @result nvarchar(MAX) OUTPUT AS

    SELECT @result = STUFF((SELECT cid AS cid
                            FROM db
                            --Should there be a WHERE here?
                            FOR XML PATH(N'')),1,1,N'<');
GO

CREATE PROC Parent @uid int AS

    DECLARE @result nvarchar(MAX);

    EXEC Child @uid, @result OUTPUT;

    SELECT @uid UID, @result AS Result;
GO

Это скорее буквальная копия того, что у вас есть в вашем вопросе. Возможно, это то, что вам нужно с помощью функции inline-table:

CREATE FUNCTION Child (@uid int)
RETURNS TABLE
AS RETURN

    SELECT  STUFF((SELECT cid AS cid
                   FROM db
                   --Should there be a WHERE here?
                   FOR XML PATH(N'')),1,1,N'<') AS cid;
GO

CREATE PROC Parent @uid int AS


    SELECT @uid UID,
           C.cid
    FROM [Table]
         CROSS APPLY dbo.Child(@uid) C
GO

Как я уже говорил в комментариях, кажется, что здесь не хватает ГДЕ или чего-то еще.

...