sql >> データベース >  >> RDS >> Sqlserver

NULLを返すSQLクエリXML値

    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);
    


    1. Python+MySQL-一括挿入

    2. 致命的な問題を解決する方法:スーパーユーザー以外の接続制限を超えました

    3. MS Excel-外部(SQL)データをローカルテーブル(シート)と結合する

    4. mysql行のデータをphpの列として表示します