sql-server-2005
  • xquery
  • 2009-09-08 2 views 7 likes 
    7

    このSQLは、最初のアクティビティ要素のみを返します。それらをすべて選択するにはどうすればいいですか?クエリで[1]を削除すると、 "value()にシングルトンが必要"というエラーが表示されます。SQL Serverのvalue()を使用してxml列から複数のレコードを取得する

    DECLARE @myDoc xml 
        SET @myDoc = 
        '<Root> 
         <Activities> 
          <Activity>This is activity one</Activity> 
          <Activity>This is activity two</Activity> 
          <Activity>This is activity three</Activity> 
         </Activities> 
        </Root>' 
    
        SELECT @myDoc.value('(/Root/Activities/Activity)[1]', 'varchar(100)') 
    

    答えて

    15

    おかげでエドが、私は簡単にバージョンが見つかりました:

    SELECT T.C.value('.', 'varchar(100)') as activity 
    FROM @myDoc.nodes('(/Root/Activities/Activity)') as T(C) 
    

    けれども、あなたの「不必要に複雑」の例から、それは困ったことに、簡単なようだが...ここで

    +1

    XMLタグが複数回表示され、表示される回数を何回選択したいのですか? http://stackoverflow.com/questions/26426412/how-to-ensure-the-sql-isable-the-sql-is-able-to-read-all-xml-tag-data – SearchForKnowledge

    +0

    Tとは何かCは何ですか –

    +0

    Tはエイリアスですnodes関数によって作成された派生テーブルの場合そのノード関数は、すべてのアクティビティノード名+値を含むXMLの一部を返します(もしあれば、任意の子ノードと値も返します)。 Cは列エイリアスです。この場合、xmlはその列の各行の 'Activity'ノードに分割されます。 – Davos

    2

    これは機能しますが、不必要に複雑なようです。簡単な方法があるかもしれません。

    DECLARE @myDoc xml 
        SET @myDoc = 
        '<Root> 
         <Activities> 
          <Activity>This is activity one</Activity> 
          <Activity>This is activity two</Activity> 
          <Activity>This is activity three</Activity> 
         </Activities> 
        </Root>' 
    
    SELECT activity.VALUE('(//Activity)[1]','varchar(100)') AS activity 
    FROM (
         SELECT NewTable.activity.query('.') AS activity 
         FROM (SELECT 1 AS col1) AS t 
         CROSS APPLY @myDoc.nodes('(/Root/Activities/Activity)') AS NewTable(activity) 
        ) AS x 
    
    0

    は別の状況とソリューションです:私は1つのクエリを使用して選択する2つの要素があるこの状況を検索していました。

    CREATE TABLE #Table1 (ID INT IDENTITY(1,1),XMLDoc XML) 
    
    INSERT INTO #Table1 VALUES (' 
    <bookstore> 
    <name>Bookstore1</name> 
    <location>Location1</location> 
    <book> 
        <title>Titile1</title> 
        <price>40</price> 
        </book> 
    </bookstore>') 
    
    INSERT INTO #Table1 VALUES (' 
    <bookstore> 
        <name>Bookstore2</name> 
    <location>Location2</location> 
    <book> 
        <title>Titile2</title> 
        <price>50</price> 
    </book> 
    </bookstore>') 
    
    
    SELECT ID, 
    T.c.value('title[1]','varchar(50)') AS 'BookTitile', 
    T.c.value('price[1]','decimal(18,2)') AS 'Price' 
    FROM #Table1 
    CROSS APPLY #Table1.XMLDoc.nodes('/bookstore/book') T(c) 
    
    DROP TABLE #Table1 
    

    必要に応じてこれを変更して、XMLNamespacesを組み込むことができます。 解決策は最初に見つかった:https://social.msdn.microsoft.com/Forums/sqlserver/en-US/35e75e32-9ffb-4a30-8637-2cc928554763/selecting-multiple-values-from-multiple-rows-of-xml?forum=sqlxml

    関連する問題