2012-10-04 65 views
3

我的情況是這樣的(簡化):TSQL的XML架構屬性添加到根節點

DECLARE @period XML = (
SELECT 
'2012' 'period' 
FOR XML PATH(''), ROOT ('survey')) 

DECLARE @persons XML = (
SELECT 
Person.Name 'users/person' 
FROM Person 
FOR XML PATH(''), ROOT ('company')) 

SET @persons.modify('insert sql:variable("@period") as first into (/company)[1]') 
SELECT @persons 

,給了我這樣的XML:

<company> 
    <survey> 
    <period>2012</period> 
    </survey> 
    <users> 
    <person>Dubach</person> 
    </users> 
    <users> 
    <person>Pletscher</person> 
    </users> 
    ... 

現在我需要添加一個基於XML架構這樣的根節點:

<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mydomain.com/xmlns/bla/blabla/myschema.xsd" xmlns="http://www.mydomain.com/xmlns/bla/blabla"> 
    <survey> 
    <period>2012</period> 
    </survey> 
    <users> 
    <person>Dubach</person> 
    </users> 
    <users> 
    <person>Pletscher</person> 
    </users> 
    ... 

Microsoft says I have to use WITH XMLNAMESPACES SELECT語句前,但這並不在我的情況下工作。

如何添加這些xmlnamespaces?

回答

3

我找到了一個解決方案在這裏加入所有的命名空間:

https://stackoverflow.com/a/536781/1306012

明顯它不是很「好」的風格,但在我的情況下,它的工作原理,我還沒有發現其他可行的解決方案然而。

SOLUTION

DECLARE @period XML = (
SELECT 
'2012' 'period' 
FOR XML PATH(''), ROOT ('survey')) 

DECLARE @persons XML = (
SELECT 
Person.Name 'users/person' 
FROM Person 
FOR XML PATH(''), ROOT ('company')) 

SET @persons.modify('insert sql:variable("@period") as first into (/company)[1]') 

-- SOLUTION 
SET @persons = replace(cast(@persons as varchar(max)), '<company>', '<company xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mydomain.com/xmlns/bla/blabla/myschema.xsd" xmlns="">') 


SELECT @persons 
4

將select中的聲明分開,然後使用with xmlnamespaces作爲described

DECLARE @persons XML 

;with xmlnamespaces (
    'http://www.mydomain.com/xmlns/bla/blabla' as ns, 
    'http://www.w3.org/2001/XMLSchema-instance' as xsi 
) 
select @persons = (
    select 
     Person.Name as 'ns:users/person' 
     FROM Person 
    FOR XML PATH(''), ROOT ('company') 
) 

set @persons.modify('insert (attribute xsi:schemaLocation {"http://www.mydomain.com/xmlns/bla/blabla/myschema.xsd"}) into (/company)[1]') 
+0

謝謝您的回答。它適用於一個名稱空間。如何添加三個名稱空間,如我的文章中所描述的? –

+0

將它們添加到with-see編輯 – podiluska

+0

謝謝,我該如何更改「schemaLocation」前綴?我發現我可以使用「DEFAULT」作爲默認的「xmlns」,但我如何創建「xsi:schemaLocation」? –