あなたの出力がどのように見えるべきかは私にははっきりしていません。ただし、これで開始できます。
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で「Name」要素が照会されます。正確に必要な出力の種類に応じて、照会を変更できます。少し長いですが、SQLXMLに関するMSDNの記事は非常に有益です。
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'
もう1つの更新。うまくいけば、これはあなたが探している答えです!
クエリでワイルドカードを使用してみてください。XML query()関数はパスに対して文字列リテラル(sql:variable( "@ filter")を使用できます)のみを取得するため、動的SQLを使用する必要がありましたが、パスに対してそれを機能させることができませんでした。 )。
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
これにより、Elem1 XML(およびすべてのサブノード)が返されます。
<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'