2017-11-20 15 views
1

テーブルにXML列があり、XMLの値を使用してテーブルの行をフィルタリングする必要があります。XML列の値を使用してテーブルを照会

は、テーブル名があることしてみましょう:mytable &は、列名があることしてみましょう:mycolumn

サンプルXML:

<TxMsg> 
    <TxCode>sometxt</TxCode> 
    <TxType>sometxttype</TxType> 
    <Roads>someroads</Roads> 
    <VehicleId>QWE123</VehicleId> 
...etc 
<TxMsg> 

私は私だけVehicleId = 'QWE123'が含まれている行を見ることができるというのが私のテーブルには、このような照会する方法は?

私のような解決策を見つけることを期待しています:

SELECT * FROM mytable WHERE mycolumn.(xpath) = 'QWE123' 

答えて

0

を私のgithubのリポジトリ(https://github.com/KELightsey/chamomile/blob/master/presentation/xquery_shredding_a_table)でそれを行う方法の完全なプロトタイプがあります。もちろん

{ 
-- 
-- get only the log entries having a data node in any position (//* syntax) 
------------------------------------------------- 
SELECT * 
FROM @entry AS [entry] 
     CROSS APPLY [entry].[nodes]('/*') AS [table] ([column]) 
WHERE CAST([table].[column].[query]('fn:local-name(.)') AS [SYSNAME]) = N'log' 
     AND [entry].exist('//*[local-name()="data"]') = 1; 
} 

はあなたが値を使用したいと思う:

あなたはその全体の例を見てみたいと思うでしょうが、「フィルタは」クロスに基づいており、このようなXML列から適用されます次のようなフィルタを適用してください:

{ 
-- 
-- get only the log entries having a data node in any position (//* syntax) 
------------------------------------------------- 
SELECT [entry] 
     , [entry].value(N'(./*/text())[1]', N'nvarchar(max)')    AS [value] 
     , [entry].value(N'(./*/@application)[1]', N'sysname')    AS [application] 
     , [entry].value(N'(./*/@timestamp)[1]', N'datetime')    AS [timestamp] 
     , [entry].query(N'(./*/data/*)[1]')        AS [data] 
     , [entry].value(N'(./*/special_note/text())[1]', N'nvarchar(max)') AS [special_note] 
FROM @entry AS [entry] 
     CROSS APPLY [entry].[nodes]('/*') AS [table] ([column]) 
WHERE CAST([table].[column].[query]('fn:local-name(.)') AS [SYSNAME]) = N'log' 
     AND [entry].value(N'(./*/text())[1]', N'nvarchar(max)') = 'This is a log item.'; 
} 

0
SELECT * FROM mytable where mycolumn.value('/TxMsg/VehicleId[1]','nvarchar(max)') LIKE 'QWE123' 

私は列 'MYCOLUMNが' 'mytableは' テーブルに 'XML' データ型として設定されている願っています。 Xmlからデータを抽出するには、 'value()'関数を使用する必要があります。これがうまくいきたいです。

1

where句にexist()を使用する必要があります。

select * 
from dbo.mytable as T 
where T.mycolumn.exist('/TxMsg/VehicleId/text()[. = "QWE123"]') = 1; 

変数またはパラメータを使用する場合は、sql:variableを使用してください。

declare @VehicleId varchar(6) = 'QWE123'; 

select * 
from dbo.mytable as T 
where T.mycolumn.exist('/TxMsg/VehicleId/text()[. = sql:variable("@VehicleId")]') = 1; 
関連する問題