Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Phân tích cú pháp XML với lồng đa cấp trong SQL

Giả sử bạn có XML của mình trong một biến SQL Server được gọi là @XML , bạn có thể sử dụng XQuery gốc hỗ trợ trong SQL Server 2005 và mới hơn để thực hiện điều này một cách thanh lịch và hiệu quả hơn nhiều:

DECLARE @XML XML = '...(your XML here).....' 

SELECT
    RootID = @xml.value('(/Root/@ID)[1]', 'int'),
    ConditionSetOperator = XC.value('@Operator', 'varchar(50)'),
    ConditionID =  XC2.value('@ID', 'int'),
    ConditionOperator = XC2.value('@Operator', 'varchar(50)')
FROM 
    @Xml.nodes('//ConditionSet') AS XT(XC)
CROSS APPLY
    xc.nodes('Condition') AS XT2(XC2)

Điều này cho tôi kết quả là

Với các toán tử XQuery như .nodes() hoặc .value() , bạn có thể dễ dàng "cắt nhỏ" tài liệu XML thành dữ liệu quan hệ và lưu trữ khi cần.

Lệnh gọi đầu tiên tới @xml.nodes('//ConditionSet') sẽ nhận được một bảng "giả" cho mỗi nút phù hợp - vì vậy mỗi <ConditionSet> sẽ được trả về trong bảng "pseudo" XT dưới dạng cột XC và sau đó tôi có thể dễ dàng lấy các thuộc tính (hoặc các phần tử XML) từ phân đoạn XML đó bằng cách sử dụng các phương thức XQuery như .value() .

Hoặc tôi thậm chí có thể lấy danh sách các nút phụ <Condition> cho mỗi <ConditionSet> đó các nút - sử dụng CROSS APPLY với cuộc gọi thứ hai tới .nodes()




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server - TRƯỚC KHI CHÈN kích hoạt

  2. CẬP NHẬT nếu tồn tại CHÈN khác trong SQL Server 2008

  3. Hiểu kiểm tra kết thúc CTE đệ quy

  4. Tablix:Lặp lại các hàng tiêu đề trên mỗi trang không hoạt động - Trình tạo Báo cáo 3.0

  5. Làm thế nào để đặt thuộc tính SSRS ConsumeContainerWhitespace trong Visual Studio 2008?