2013-11-03 2 views
1

У меня есть Sample Xml, который выглядит примерно так:запрос не возвращает правильные результаты - Sql Server XQUERY

<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.12345" RevNumber="1"> 
    <tst:stuff someID="1">This is <tst:comment>1st.</tst:comment> what I <tst:comment>2nd</tst:comment>just want to show</tst:stuff> 
</tst:Root> 

Как я могу просто вернуться «Это то, что я просто хочу, чтобы показать»?

Вот столы и то, что я пробовал.

CREATE TABLE [dbo].[XmlTable](
    [XmlId] [int] IDENTITY(1,1) NOT NULL, 
    [XmlDoc] [xml] NOT NULL, 
CONSTRAINT [PK_XmlTable] PRIMARY KEY CLUSTERED 
(
    [XmlId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO 
SET IDENTITY_INSERT [dbo].[XmlTable] ON 

INSERT [dbo].[XmlTable] ([XmlId], [XmlDoc]) VALUES (1, N'<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.12345" RevNumber="1"><tst:stuff someID="1">This is <tst:comment>1st.</tst:comment> what I <tst:comment>2nd</tst:comment>just want to show</tst:stuff></tst:Root>') 
SET IDENTITY_INSERT [dbo].[XmlTable] OFF 

и то, что я пробовал:

Это одна только возвращает «Это», как и ожидалось.

--WITH XMLNAMESPACES (Default 'http://tempuri.org/some.xsd') 
--SELECT  

-- a.value('text()[1]', 'nvarchar(100)') as SampleXml 
-- From 
-- XmlTable As x 
-- Cross Apply XmlDoc.nodes('Root/stuff') a(a) 

Это один возвращается все: «Это первое, что я 2ndjust хочу показать»

WITH XMLNAMESPACES (Default 'http://tempuri.org/some.xsd') 
SELECT  

    a.value('.', 'nvarchar(100)') as SampleXml 
    From 
    XmlTable As x 
    Cross Apply XmlDoc.nodes('Root/stuff') a(a) 

Как можно исключить комментарий узлов, но все-таки получить правильные результаты?

EDIT:

Я хочу, чтобы вернуть его, как это:

enter image description here

Есть ли более простой способ сделать это, чем следующее:

WITH XMLNAMESPACES (Default 'http://tempuri.org/some.xsd') 
SELECT  

a.value('text()[1]', 'nvarchar(100)') + a.value('text()[2]', 'nvarchar(100)') + a.value('text()[3]', 'nvarchar(100)') as SampleXml 

From 
XmlTable As x 
Cross Apply XmlDoc.nodes('Root/stuff') a(a) 

ответ

2

Попробуйте это:

declare @xml xml; 

set @xml = convert(xml, 'your XML'); 

with xmlnamespaces (Default 'http://tempuri.org/some.xsd') 
select @xml.query('//stuff/text()') 

Предполагая, что у вас есть таблица со столбцом XML, он будет выглядеть следующим образом:

-- Set up the XML table to demonstrate 
declare @table table 
(
     ID int, 
     xmlDoc xml 
) 

-- insert your example XML 
insert into @table 
Values (1, '<tst:Root xmlns:tst="http://tempuri.org/some.xsd" SchemaVersion="0.2.1234.12345" RevNumber="1"><tst:stuff someID="1">This is <tst:comment>1st.</tst:comment> what I <tst:comment>2nd</tst:comment>just want to show</tst:stuff></tst:Root>'); 

-- Do the query 
with xmlnamespaces (Default 'http://tempuri.org/some.xsd') 
select ID, xmlDoc.query('//Root/stuff/text()') as SampleXml 
from @table 

Это то, что мой результат выглядит следующим образом:

enter image description here

+0

Спасибо за ответ, я хочу это как один ряд не 3! Я смог получить его с обновленным запросом, который я разместил, мне просто интересно, был ли лучший способ! Кажется, это не лучший способ. Активировано для хорошего ответа. Еще раз спасибо! – user1307149

+0

Это может быть проще, чем вы это делаете. Предполагая, что ваш XML-документ является полем в записи, вам вообще не нужно использовать Cross Apply (если вы не хотите делать другие вещи, о которых вы не упоминали). См. Мой обновленный ответ для примера. –

+0

Получил благодарность за помощь! – user1307149

Смежные вопросы