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

    Ten SQL zwraca tylko pierwszy element Activity. Jak mogę je wszystkie wybrać? Jeśli usunę [1] z kwerendy, otrzymam błąd, że "wartość() wymaga pojedynczego".Uzyskiwanie wielu rekordów z kolumny xml z wartością() w SQL Server

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

    Odpowiedz

    15

    Dzięki Ed, ale znalazłem łatwiejszą wersję:

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

    chociaż ze swojego "niepotrzebnie skomplikowane" przykład to wydaje się niepokojąco proste ..

    +1

    Co się stanie, jeśli tag XML pojawi się wiele razy i chciałbym wybrać tyle razy, ile się pojawi? http://stackoverflow.com/questions/26426412/how-to-ensure-the-sql-isable-to-read-all-xml-tag-data – SearchForKnowledge

    +0

    Co to jest T i co to jest C –

    +0

    T to alias dla wyprowadzonej tabeli utworzonej przez funkcję węzłów. Ta funkcja węzłów zwraca fragment xml zawierający wszystkie wartości + wartości węzłów aktywności (i zwróciłby także wszystkie węzły i wartości potomne, gdyby były). C jest aliasem kolumny, w tym przypadku dzieli xml na węzły "Activity" w każdym wierszu tej kolumny. – Davos

    2

    To działa, ale wydaje się niepotrzebnie skomplikowane. Może być łatwiejszy sposób.

    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

    Oto kolejna sytuacja i rozwiązanie: I szukał tej sytuacji, w której za pomocą jednego zapytania można wybrać dwa elementy.

    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 
    

    Możesz modyfikować to w razie potrzeby, aby dołączyć przestrzenie XMLNames. Rozwiązanie pierwotnie znalezione pod adresem: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/35e75e32-9ffb-4a30-8637-2cc928554763/selecting-multiple-values-from-multiple-rows-of-xml?forum=sqlxml

    Powiązane problemy