用于 xml 的 TSQL 将架构属性添加到根节点



我的情况是这样的(简化):

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说我必须在 SELECT 语句之前使用 WITH XMLNAMESPACES,但这在我的情况下不起作用。

如何添加这些 xml命名空间?

声明与选择分开,然后按照说明使用with xmlnamespaces

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]')

我找到了在此处添加所有命名空间的解决方案:

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

显然这不是很"好"的风格,但就我而言,它可以工作,我还没有找到另一个可行的解决方案。

溶液

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

最新更新