2016-03-04 16 views
2

我有2 sprocs的任務,我想要做的是將xml輸出從一個sproc傳遞到另一個,並將其放入一個變量,我知道ex1.xml_sp1返回一個int,同時調用它與EXEC,顯然當試圖選擇它時它返回null,因爲@x是xml數據類型。如何將xml數據從一個sproc傳遞到另一個sproc?

我想要做的是檢索和存儲過程從1 XML數據存儲在@x存儲過程2.

有沒有辦法做到這一點?

存儲過程1:

ALTER PROC [ex1].[xml_sp1] 
@careteamid int 
as 

select CareTeams.CareTeamID, Doctors.DoctorID, Doctors.DoctorName, 
    CareTeamDoctors.DateJoined, CareTeamDoctors.CurrentMember 
from dbo.CareTeamTbl as CareTeams 
inner join dbo.CareTeamDoctorTbl as CareTeamDoctors on 
CareTeams.CareTeamID = CareTeamDoctors.CareTeamID 
inner join dbo.DoctorTbl as Doctors on 
CareTeamDoctors.DoctorID=CareTeamDoctors.DoctorID 
where CareTeamDoctors.CareTeamID = @careteamid 
and CareTeamDoctors.DoctorID = Doctors.DoctorID 
for xml auto, root('thedata') 

存儲過程2:

ALTER PROC [ex1].[xml_sp2] 
@careteamid int 
as 
declare @x xml 

exec @x = ex1.xml_sp1 
      @careteamid = @careteamid 

select @x as XMLData 

回答

3

我想要做的是檢索和存儲從存儲過程1中的XML數據在存儲過程@x 2

你可以實現它很容易使用OUTPUT parameters

CREATE PROCEDURE [xml_sp1] 
    @careteamid INT, 
    @xml_output XML OUTPUT 
AS 
BEGIN 
    SET @xml_output = (SELECT * FROM ... FOR XML AUTO, root('thedata')); 
END; 
GO 

CREATE PROCEDURE [xml_sp2] 
    @careteamid INT 
AS 
BEGIN 
    DECLARE @x XML; 

    EXEC [xml_sp1] 
    @careteamid, 
    @x OUTPUT; 

    SELECT @x AS XMLData; 
END; 
GO 

和最終呼叫:

EXEC [xml_sp2] @careteamid = 1; 

LiveDemo

考慮使用BEGIN/END塊和結束每個語句;以避免可能討厭的問題。

可能的共享數據的方法How to Share Data between Stored Procedures by Erland Sommarskog

+1

正是我以後,謝謝百萬 – BoogaWooga

-1

將這項工作?

declare @xml xml 
set @xml = (select * 
      from tableABC 
      for xml auto, elements) 

然後將該變量傳遞給另一個sproc?

我去的答案從這裏

How to insert FOR AUTO XML result into table?

在我看來,這個想法是相似的,或應該工作類似。

2

爲什麼不嘗試,而不是分配SP1的輸出這將直接

declare @t table 
    (
    val xml 
    ) 

    insert into @t 
    exec ex1.xml_sp1 
    @careteamid = @careteamid 

    select * from @t 
+0

這有一定的侷限性,你應該知道:[INSERT-EXEC(http://www.sommarskog.se/share_data.html#INSERTEXEC) – lad2025

+0

謝謝你的鏈接,這是有幫助的 – TheGameiswar

3

對於返回值(即EXEC @ReturnValue = StoredProcName...;)的完整列表,INT是允許的唯一數據類型。如果這需要真正保留爲存儲過程,那麼您可以使用OUTPUT變量或在第二個存儲過程中創建臨時表或表變量,並執行INSERT INTO ... EXEC StoredProc1;

然而,考慮到第一個存儲過程只是做一個簡單的SELECT語句,你會好得多轉換這是一個內聯表值函數(iTVF)如下:

CREATE FUNCTION dbo.GetData (@CareTeamID INT) 
RETURNS TABLE 
AS RETURN 

SELECT tab.col AS [CareData] 
FROM ( 
    SELECT CareTeams.CareTeamID, Doctors.DoctorID, Doctors.DoctorName, 
      CareTeamDoctors.DateJoined, CareTeamDoctors.CurrentMember 
    FROM dbo.CareTeamTbl as CareTeams 
    INNER JOIN dbo.CareTeamDoctorTbl as CareTeamDoctors 
      ON CareTeams.CareTeamID = CareTeamDoctors.CareTeamID 
    INNER JOIN dbo.DoctorTbl as Doctors 
      ON CareTeamDoctors.DoctorID=CareTeamDoctors.DoctorID 
    WHERE CareTeamDoctors.CareTeamID = @CareTeamID 
    AND CareTeamDoctors.DoctorID = Doctors.DoctorID 
    FOR XML AUTO, ROOT('thedata'), TYPE -- "TYPE" causes result to be XML and not NVARCHAR 
    ) tab(col); 

然後只是改變了第二個存儲過程是:

SELECT care.CareData AS [XMLData] 
FROM dbo.GetData(@CareTeamID); 

或者,如果你確實需要使用第二存儲過程XML數據,請執行以下操作:

DECLARE @TempData XML; 

SELECT @TempData = care.CareData 
FROM dbo.GetData(@CareTeamID); 

最後,如果您需要XML數據實際上是來自iTVF的XML數據類型(或者即使將它保存爲存儲過程),那麼您需要將TYPE選項添加到FOR XML子句中,還有什麼是返回是一個字符串/ NVARCHAR(MAX)

FOR XML AUTO, ROOT ('thedata'), TYPE 
+0

我需要將它作爲XML數據類型傳遞,因爲我的任務需要我使用xquery將XML數據切成一個臨時表,但我沒有提到,因爲我知道如何做到這一點非常簡單,我遇到的問題實際上是將第一個sproc的輸出傳遞給第二個sproc來做到這一點,希望能夠澄清:) – BoogaWooga

+0

@ConorS I get那。只要你將這個值放入一個'XML'變量中,那麼在這一點上就完全一樣了。我只是展示瞭如何做到這一點,如果你或任何人這樣做的工作,而不是一項任務(即正確和有效):-) –

相關問題