2009-09-08 37 views
7

SQL này chỉ trả về phần tử Hoạt động đầu tiên. Làm thế nào để tôi chọn tất cả? Nếu tôi xóa [1] trong truy vấn, tôi nhận được lỗi rằng "value() yêu cầu một singleton".Lấy nhiều bản ghi từ cột xml có giá trị() trong 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)') 

Trả lời

15

Cảm ơn Ed, nhưng tôi tìm thấy một phiên bản dễ dàng hơn:

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

Mặc dù từ "không cần thiết phức tạp" ví dụ của bạn có vẻ như đáng lo ngại đơn giản ..

+1

Điều gì sẽ xảy ra nếu thẻ XML xuất hiện nhiều lần và tôi muốn chọn bao nhiêu lần như xuất hiện? http://stackoverflow.com/questions/26426412/how-to-ensure-the-sql-is-able-to-read-all-xml-tag-data – SearchForKnowledge

+0

T là gì và C –

+0

T là bí danh cho bảng dẫn xuất được tạo bởi hàm nút. Hàm nút đó trả về một phần của xml bao gồm tất cả các giá trị tên nút + Hoạt động (và sẽ trả về bất kỳ nút con và giá trị nào nếu có). C là một bí danh cột, trong trường hợp này, nó chia nhỏ xml thành các nút 'Hoạt động' trên mỗi hàng của cột đó. – Davos

2

Công trình này, nhưng có vẻ phức tạp không cần thiết. Có thể có một cách dễ dàng hơn.

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

Dưới đây là một tình huống và giải pháp: Tôi đang tìm kiếm tình huống này khi có hai yếu tố được chọn bằng một truy vấn.

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 

Bạn có thể sửa đổi điều này theo yêu cầu để bao gồm XMLNamespaces. Giải pháp ban đầu được tìm thấy tại: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/35e75e32-9ffb-4a30-8637-2cc928554763/selecting-multiple-values-from-multiple-rows-of-xml?forum=sqlxml

Các vấn đề liên quan