簡體   English   中英

SQL Server XQuery修改

[英]SQL Server XQuery modify

我正在編寫T-SQL UDF,並嘗試使用游標獲取的值修改xml變量。 該代碼可以很好地執行,但是不會對xml變量進行修改。

代碼如下:

CREATE FUNCTION GetDateBlockXmlFromTable(@occupieddates occupieddates READONLY)
RETURNS XML
AS
BEGIN
   DECLARE @xmlresult xml;
   DECLARE @datefrom datetime, @dateto datetime;

   SELECT @xmlresult = '<root><DateBlocks/></root>';

   DECLARE GetDateBlockXmlFromTable_Cur 
   CURSOR FOR 
        SELECT DateFrom, DateTo FROM @occupieddates

   OPEN GetDateBlockXmlFromTable_Cur 

   FETCH NEXT FROM GetDateBlockXmlFromTable_Cur INTO @datefrom, @dateto

   WHILE @@FETCH_STATUS = 0
   BEGIN
      SET @xmlresult.modify('insert <DateBlock><FirstDay>"{sql:variable("@datefrom")}"</FirstDay><EndDay>"{sql:variable("@dateto")}"</EndDay></DateBlock> as last into (/DateBlocks)[1]');

      FETCH NEXT FROM GetDateBlockXmlFromTable_Cur INTO @datefrom, @dateto
   END

   CLOSE GetDateBlockXmlFromTable_Cur
   DEALLOCATE GetDateBlockXmlFromTable_Cur

   RETURN @xmlresult;
END

占用日期只讀輸入表如下所示:

CREATE TYPE occupieddates  AS TABLE 
(
   DateFrom datetime, 
   DateTo datetime, 
)

只需更改

as last into (/DateBlocks)[1]

as last into (/root/DateBlocks)[1]

您可以考慮將結果變量聲明更改為SELECT @xmlresult = '<DateBlocks/>'

而且您也可以考慮使用for xml語句:

CREATE FUNCTION GetDateBlockXmlFromTable(@occupieddates occupieddates READONLY)
RETURNS XML
AS
BEGIN
    DECLARE @xmlresult xml;

    set @xmlresult = (
        select
            (select
                '"' + convert(varchar, DateFrom, 126) + '"'  as FirstDay,
                '"' + convert(varchar, DateTo, 126) + '"' as EndDay
            from
                @occupieddates
            for xml path('DateBlock'), type)
        for xml path('DateBlocks')--, root('root') -- depending on need
    )

    return @xmlresult;
END

好像你應該改變

...into (/DateBlocks)...

...into (/root/DateBlocks)...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM