SQL Server 2008 - 关于粉碎XML的基本问题

时间:2010-10-27 21:07:20

标签: sql-server xml sql-server-2008

我在sql server中使用XML有点新鲜,并且在获取正确语法方面遇到了问题 - 就此而言,可能对引用XML元素有一些基本的困惑。

无论如何,我需要将下面的XML分解成列。看起来很简单,但我似乎无法使节点正确 - 或者就此而言,我认为我也没有正确地执行xmlnamespaces。我还没有发现很多在线帮助。非常感谢任何提示!

感谢, 西尔维亚

DECLARE @pStepLogXML  xml;
select     @pStepLogXML = '<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2010 (http://www.altova.com)-->
<Applescommon:ActivityStepLogList xsi:schemaLocation="urn:SampleCompany:Apples:common:v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:Applescommon="urn:SampleCompany:Apples:common:v1">
    <Applescommon:ActivityStepLog>
        <Applescommon:GUID>3F2504E0-4F89-11D3-9A0C-0305E82C3301</Applescommon:GUID>
        <Applescommon:ContextID>3F2504E0-4F89-11D3-9A0C-0305E82C3302</Applescommon:ContextID>
        <Applescommon:LogType>PreStep</Applescommon:LogType>
        <Applescommon:SourceID>com.SampleCompany.e3.es.Apples.common.ApplesCommonMessageHandler.processMessage</Applescommon:SourceID>
        <Applescommon:LogContent><![CDATA[
<TestXML><XXXXXX></TestXML>
        ]]></Applescommon:LogContent>
        <Applescommon:LogTime>2001-12-17T09:30:47Z</Applescommon:LogTime>
    </Applescommon:ActivityStepLog>
    <Applescommon:ActivityStepLog>
        <Applescommon:GUID>3F2504E0-4F89-11D3-9A0C-0305E82C3303</Applescommon:GUID>
        <Applescommon:ContextID>3F2504E0-4F89-11D3-9A0C-0305E82C3302</Applescommon:ContextID>
        <Applescommon:LogType>PostStep</Applescommon:LogType>
        <Applescommon:SourceID>com.SampleCompany.e3.es.Apples.common.ApplesCommonMessageHandler.processMessage</Applescommon:SourceID>
        <Applescommon:LogContent><![CDATA[
<TestXML><XXXXXX></TestXML>
        ]]></Applescommon:LogContent>
        <Applescommon:LogTime>2001-12-17T09:30:47Z</Applescommon:LogTime>
    </Applescommon:ActivityStepLog>
</Applescommon:ActivityStepLogList>';

with xmlnamespaces (default 'urn:Applescommon:ActivityStepLogList:v1')
select 
   --convert(varchar(64), MyTables.MyColumns.value('Applescommon:GUID/text()', n'nvarchar(100)')
   -- MyTable.MyColumns.value('Applescommon:GUID/text()', N'nvarchar(50)') AS Test,
   --,
   1
from @pStepLogXML.nodes('/Applescommon:ActivityStepLog' )
    as T(c)

编辑:

好的,想通了。我基本上让xmlnamespaces和节点搞砸了。我以为我从有效的代码中复制了它们(适当地改变它们),所以如果有人愿意指出我对这些的一个很好的连贯解释,我会给他们答案。

另外,我没有获取列数据的问题,所以我只为一个占位符添加1 - 下面我实际上放了一个真正的列。

感谢阅读!

西尔维亚

with xmlnamespaces (default 'urn:SampleCompany:Apples:common:v1')
select 
   --convert(varchar(64), MyTables.MyColumns.value('Applescommon:GUID/text()', n'nvarchar(100)')
   -- MyTable.MyColumns.value('Applescommon:GUID/text()', N'nvarchar(50)') AS Test,
   --,
   T.c.query('SourceID/text()')
   ,1
from @pStepLogXML.nodes('/ActivityStepLogList/ActivityStepLog' )
    as T(c)

1 个答案:

答案 0 :(得分:1)

XQuery并不容易,直到你掌握了它 - 我真的没有一个“神奇”的网站,只是告诉你一切然后你知道....我读过的最好的介绍文章是

SQL Server 2005 XQuery and XML-DML(由3部分组成的系列文章)

还有:An Introduction to XQuery in SQL Server 2005

最重要的是:练习,练习,练习:-)没什么新的,对吧?

现在你的上一次查询还可以 - 但你可以让它更容易:

with xmlnamespaces (default 'urn:SampleCompany:Apples:common:v1')
select 
   T.C.value('(GUID)[1]', 'nvarchar(50)') AS Test,
   T.C.value('(ContextID)[1]', 'nvarchar(50)') AS ContextID,
   T.C.value('(SourceID)[1]', 'nvarchar(50)') AS SourceID,
   --,
   1
from 
    @pStepLogXML.nodes('/ActivityStepLogList/ActivityStepLog') as T(c)

使用.value()函数(而不是.query())会立即为您提供“原子”值,您还可以定义该值应该是哪种输出数据类型。