xml に名前空間 xmlns="http://www.webserviceX.NET/"
が含まれています 、これはデフォルトの名前空間です .宣言するか、プレフィックスにワイルドカードを使用する必要があります。
XML には、いくつかのベスト プラクティスがあります。
- できるだけ具体的に
- 前方ナビゲーションのみ
- 重要 XML の作成を管理している場合は、日付と時刻の形式を ISO8601 に変更します。形式は文化に固有のものであり、さまざまなシステムで簡単に変換エラーが発生する可能性があります。 Best は
<DateAndTime>2017-05-23T12:37:00</DateAndTime>
のような組み合わせの値でした
あなたの問題にはいくつかのアプローチがあります:
DECLARE @xml XML=
N'<string xmlns="http://www.webserviceX.NET/">
<StockQuotes>
<Stock>
<Symbol>ENGI.PA</Symbol>
<Last>13.53</Last>
<Date>5/23/2017</Date>
<Time>12:37pm</Time>
<!--more elements -->
</Stock>
</StockQuotes>
</string>';
-- 最善の方法:XMLNAMESPACES
デフォルトの名前空間を宣言する
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT @xml.value(N'(/string/StockQuotes/Stock/Symbol/text())[1]',N'nvarchar(max)');
--暗黙の名前空間宣言:
SELECT @xml.value(N'declare namespace ns="http://www.webserviceX.NET/";
(/ns:string/ns:StockQuotes/ns:Stock/ns:Symbol/text())[1]',N'nvarchar(max)');
-- ほとんどの場合は推奨されませんが、怠惰な人には適しています :-D
SELECT @xml.value(N'(//*:Symbol)[1]',N'nvarchar(max)');
--同じレベルの値をさらに読みたい場合は、.nodes
を使用できます 現在のノードを ...<Stock>
に設定します .
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT st.value('(Symbol/text())[1]',N'nvarchar(max)')
,st.value('(Last/text())[1]',N'decimal(10,4)')
--more nodes
FROM @xml.nodes(N'/string/StockQuotes/Stock') AS A(st);