如何在查询期间在元素中添加xml命名空间?

时间:2012-09-14 01:20:08

标签: sql xml sql-server-2008 tsql

使用以下

DECLARE @t TABLE (Test nvarchar(50), Location_ID uniqueidentifier);
INSERT INTO @t (Test,Location_ID ) 
SELECT Test,Location_ID 
from
dbo.TEST;
DECLARE @xml XML
;WITH XMLNAMESPACES (
'typens:GPCodedValueDomain2' as type,
'http://www.esri.com/schemas/ArcGIS/10.0' as typens, 
'http://www.w3.org/TR/html4/' AS xs, 
'http://www.w3.org/2001/XMLSchema-instance' AS xsi )
SELECT @xml = 
    (
    SELECT 
    'typens:CodedValue' AS "@xsi:type", 
    TEST AS "Name", Location_ID  AS "Code"
    FROM @t 
    order by Location_ID
    FOR XML PATH
    ('CodedValue'), ROOT
    ('GPCodedValueDomain2'),TYPE
    )
SELECT @xml

输出

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2">
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code>B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
</GPCodedValueDomain2>

我已经尝试了几个小时的命名空间定义的不同迭代,但都失败了。我正在寻找输出:

<GPCodedValueDomain2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/TR/html4/" xmlns:typens="http://www.esri.com/schemas/ArcGIS/10.0" xmlns:type="typens:GPCodedValueDomain2">
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B59D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B69D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
  <CodedValue xsi:type="typens:CodedValue">
    <Name>test update</Name>
    <Code xsi:type="xs:string">B79D3BEB-CBCE-E111-B5B0-002564D275D1</Code>
  </CodedValue>
</GPCodedValueDomain2>

关于如何实现这一点的任何想法?感谢

1 个答案:

答案 0 :(得分:1)

我不是SQL Server用户,但我想知道您是否真的提供了一个模式文档,该文档在命名空间string中定义了一个名为http://www.w3.org/TR/html4/的类型。

将前缀xs绑定到名称空间,其名称是HTML 4规范的URI,这绝对没有错。但有几件事让我想知道你是否已经清楚地定义了你的问题。

  • HTML 4规范未定义名为string的数据类型;除非您在此处未显示的架构文档中执行非常不寻常的操作,否则xs:string不会表示已知类型。
  • 您似乎将名称空间前缀type绑定到名称空间URI typens:GPCodedValueDomain2。这个名称空间前缀似乎没有在其他任何地方使用,因此不清楚它的用途是什么。在该命名空间名称中使用的URI方案typens也是在查询中其他位置定义的命名空间前缀这一事实表明您对命名空间和命名空间前缀感到困惑,或者您正在做一些非常微妙和狡猾的事情。在后一种情况下,您肯定不需要Stack Overflow的帮助。
  • 您希望输出中的xsi:typeCodedValue元素具有Code个属性。您的查询成功将属性放在第一个上,方法是为其指定SELECT 'typens:CodedValue' AS "@xsi:type", ...。但是Code元素没有类似的构造。为什么不呢?