2013-07-05 58 views
2

我正在編寫一個T-SQL UDF並嘗試修改一個xml變量,其中包含由遊標讀取的值。代碼執行得很好,但xml變量的修改不會發生。SQL Server XQuery修改

代碼去如下:

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 

的occupieddates只讀輸入表是這樣的:

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

回答

3

只需改變

as last into (/DateBlocks)[1] 

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

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

,你也可以使用cosider聲明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 
+0

這真是棒極了!太感謝了! –

1

好像你應該改變

...into (/DateBlocks)... 

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