2015-10-15 76 views
-2

我將這個XML作爲varchar傳遞給標量函數在SQL Server:SQL Server和XML

<ScreenerInfo> 
    <ExtendExpiryInfo> 
     <ExtendExpiry> 
      <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
      <Comments>nikilesh</Comments> 
      <ApprovalStatus>EE</ApprovalStatus> 
      <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
     </ExtendExpiry> 
    </ExtendExpiryInfo> 
</ScreenerInfo> 

我要檢索的註釋標記和獨立的每個註釋用逗號IT賣場之間的每一件事varchar變量並返回它,我怎麼能做到這一點......

對於如...

nikilesh,manish,done,rejected... 

這怎麼可能?

+0

評論標籤在哪裏? Whar是評論? –

+0

你到目前爲止嘗試過什麼?此外,您將字符串存儲在「varchar」還是SQL服務器中的相關事實是什麼? –

+1

[標籤:SQL服務器]和[標籤:XML] - 兩個偉大的*標籤*適用於您的問題。作爲你的問題*標題*的全部,不是那麼多。這裏的意見是,標籤不屬於標題 - 但如果我們在這裏刪除它們,我們留下*無*。 –

回答

1

我不知道,你的「manish」,「done」或「rejected」是從哪裏來的,但是當你要求評論節點的內容時,我只能假設,有更多的節點在評論節點中使用這些短語。在以下示例中,我複製了三次示例節點並更改了評論的內容。如果粘貼到一個空的查詢窗口,這個你會得到:

Result: nikilesh, manish, done 

DECLARE @xml XML= 
'<Root> 
    <ScreenerInfo> 
    <ExtendExpiryInfo> 
     <ExtendExpiry> 
      <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
      <Comments>nikilesh</Comments> 
      <ApprovalStatus>EE</ApprovalStatus> 
      <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
     </ExtendExpiry> 
    </ExtendExpiryInfo> 
    </ScreenerInfo> 
    <ScreenerInfo> 
    <ExtendExpiryInfo> 
     <ExtendExpiry> 
      <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
      <Comments>manish</Comments> 
      <ApprovalStatus>EE</ApprovalStatus> 
      <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
     </ExtendExpiry> 
    </ExtendExpiryInfo> 
    </ScreenerInfo> 
    <ScreenerInfo> 
    <ExtendExpiryInfo> 
     <ExtendExpiry> 
      <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
      <Comments>done</Comments> 
      <ApprovalStatus>EE</ApprovalStatus> 
      <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
     </ExtendExpiry> 
    </ExtendExpiryInfo> 
    </ScreenerInfo> 
</Root>'; 


SELECT STUFF(
(
    SELECT ', ' + Screener.Info.value('(ExtendExpiryInfo/ExtendExpiry/Comments)[1]','varchar(max)') 
    FROM @xml.nodes('/Root/ScreenerInfo') AS Screener(Info) 
    FOR XML PATH('') 
),1,2,'') 

如果您需要別的東西,請說明您的問題...

0

截至到我的理解我做了這個。 即使這是非常糟糕的做法,我只是爲你所問的做了。

功能可以按如下

CREATE FUNCTION xml_update 
(
    @XML xml 
) 
RETURNS varchar(MAX) 
AS 
BEGIN 

DECLARE @output VARCHAR(MAX) 

SET @output = STUFF((SELECT ', ' + tab.col.value('(Comments)[1]','VARCHAR(MAX)') 
        FROM @xml.nodes('/ScreenerInfo/ExtendExpiryInfo/ExtendExpiry') AS tab(col) FOR XML PATH('')),1,2,'') 
RETURN @output 
END 
GO 

現在你可以得到預期的輸出被寫入。

DECLARE @XML xml = '<ScreenerInfo> 
        <ExtendExpiryInfo> 

         <ExtendExpiry> 
          <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
          <Comments>nikilesh</Comments> 
          <ApprovalStatus>EE</ApprovalStatus> 
          <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
         </ExtendExpiry> 
         <ExtendExpiry> 
          <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
          <Comments>manish</Comments> 
          <ApprovalStatus>EE</ApprovalStatus> 
          <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
         </ExtendExpiry> 
         <ExtendExpiry> 
          <ActionOn>2015-05-19 13:31:40.019</ActionOn> 
          <Comments>ragul</Comments> 
          <ApprovalStatus>EE</ApprovalStatus> 
          <NewExpiryDate>2015/06/25 12:28:59PM</NewExpiryDate> 
         </ExtendExpiry> 
        </ExtendExpiryInfo> 
       </ScreenerInfo>' 

select dbo.xml_update(@XML) 

讓我知道如果你需要進一步澄清。