SQL Server 2008 - основной вопрос по измельчению XML - PullRequest
2 голосов
/ 28 октября 2010

Я немного новичок в использовании XML на сервере sql, и у меня возникла проблема с правильным синтаксисом - и в этом отношении, возможно, возникла некоторая путаница относительно ссылок на элементы XML.

В любом случае, мне нужно разделить XML, как показано ниже, на столбцы. Кажется простым, но я, кажется, не могу получить правильные узлы - или в этом отношении я не думаю, что я делаю пространства имен xml также правильно. Я еще не нашел много полезного в Интернете. Буду очень признателен за любые советы!

спасибо, Sylvia

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)

EDIT:

Ладно, разобрался. У меня в основном были пространства и узлы xmlname полностью испорчены. Я думал, что скопировал их (изменив их соответствующим образом) из работающего кода, поэтому, если кто-нибудь захочет указать мне хорошее связное объяснение, я дам им ответ.

Кроме того, у меня не было проблем с получением данных столбца, поэтому я просто поставил 1 для заполнителя - ниже я фактически поставил один из реальных столбцов.

Спасибо за чтение!

Sylvia

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 Ответ

1 голос
/ 28 октября 2010

XQuery не прост, пока вы не освоите его - у меня действительно нет "волшебного" сайта, который просто рассказывает вам все, и тогда вы знаете ... лучшая вступительная статья, которую я прочитал, была

SQL Server 2005 XQuery и XML-DML (серия статей из 3 частей)

, а также: Введение в XQuery в 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()) дает вам «атомарные» значения сразу, и вы также можете определить, каким типом выходных данных должно быть это значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...