Мне не совсем понятно, как должен выглядеть ваш вывод.Однако, это должно помочь вам начать:
create table MyXmlTable (MyXmlCol xml)
insert into MyXmlTable (MyXmlCol) values
(
'
<Root xmlns="http://tempuri.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Elem1 type="T1">
<Name type="string" display="First name">John</Name>
<TimeZone display="Time zone">
<DisplayName type="string" display="Display name">GMT Standard Time</DisplayName>
</TimeZone>
</Elem1>
<Elem1 type="T2">
<Name type="string" display="First name">Fred</Name>
<TimeZone display="Time zone">
<DisplayName type="string" display="Display name">EST Standard Time</DisplayName>
</TimeZone>
</Elem1>
</Root>
');
;WITH XMLNAMESPACES(DEFAULT 'http://tempuri.org')
select MyXmlCol.query('/Root/Elem1/Name')
from MyXmlTable
Это запрашивает XML для элементов «Имя» - вы можете изменить запрос в зависимости от того, какой именно вывод вы хотите.Это немного длинно, но статья MSDN о SQLXML довольно информативна:
http://msdn.microsoft.com/en-us/library/ms345117(v=sql.90).aspx
Надеюсь, это поможет!
Джон
Обновление: вы можете добавить кое-что из предложения whereкак это.Я до сих пор не понимаю, как вы хотите, чтобы выходные данные выглядели, но это отфильтровывает значения "Elem1":
SELECT C1.query('fn:local-name(.)') AS Nodes
FROM [dbo].[MyXmlTable] AS MyXML
CROSS APPLY MyXML.MyXmlCol.nodes('//*') AS T ( C1 )
WHERE CAST(C1.query('fn:local-name(.)') AS NVARCHAR(32)) <> 'Elem1'
Еще одно обновление;надеюсь, это ответ, который вы ищете!
Попробуйте использовать подстановочный знак в запросе.Мне пришлось использовать динамический SQL, потому что функция XML query () будет принимать только строковые литералы для путей (вы можете использовать sql: variable ("@ filter") для значений, но я не смог заставить это работать для пути.)
DECLARE @filter nvarchar(20)
SET @filter = '*/Elem1'
DECLARE @sqlCommand nvarchar(1000)
SET @sqlCommand =
';WITH XMLNAMESPACES(DEFAULT ''http://tempuri.org'')
select MyXmlCol.query(''' + @filter + ''')
from MyXmlTable'
print @sqlCommand
EXECUTE sp_executesql @sqlCommand, N'@filter nvarchar(20)', @filter = @filter
Это вернет XML Elem1 (и все подузлы):
<p1:Elem1 xmlns:p1="http://tempuri.org" type="T1">
<p1:Name type="string" display="First name">John</p1:Name>
<p1:TimeZone display="Time zone">
<p1:DisplayName type="string" display="Display name">GMT Standard Time</p1:DisplayName>
</p1:TimeZone>
</p1:Elem1>
<p2:Elem1 xmlns:p2="http://tempuri.org" type="T2">
<p2:Name type="string" display="First name">Fred</p2:Name>
<p2:TimeZone display="Time zone">
<p2:DisplayName type="string" display="Display name">EST Standard Time</p2:DisplayName>
</p2:TimeZone>
</p2:Elem1>
И если вы хотите выбрать «TimeZone», вы сделаете это:
SET @filter = '*/*/TimeZone'