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

SQL Server 2012:Dữ liệu XML phân cấp - ký tự thoát

Vấn đề của bạn:

  1. Bạn thử sử dụng đầu ra của SelectChild , thuộc loại XML, là nội dung của thuộc tính @ListDirectChildren . Bạn không thể sử dụng XML ở nơi này, do đó nó được xử lý (và thoát) như văn bản bình thường. Bạn đang cố gắng tạo một loại danh sách con đệ quy?

  2. Trong truy vấn bên ngoài của bạn, bạn truyền XML thành VARCHAR(MAX) (btw:sử dụng luôn NVARCHAR trong câu chuyện với XML). Một lần nữa, bạn sẽ buộc công cụ coi văn bản này là văn bản và do đó thoát khỏi nó.

  3. Bạn cố gắng thêm chuỗi "null" để thể hiện sự thiếu giá trị. Nhưng XML hoạt động khác:a. Phần tử bị thiếu hoàn toàn trong XML:Truy vấn nó sẽ trả về NULL , điều đó ổn.

    b. Đối với một số quy tắc, Phần tử phải có ở đó, nhưng không được để trống:
    <ListDirectChildren></ListDirectChildren> hoặc <ListDirectChildren /> (nghĩa là hoàn toàn giống nhau). Truy vấn text() của nút và bạn nhận được NULL , điều đó cũng tốt.

    c. Đối với một số quy tắc, bạn muốn đánh dấu phần tử là NULL . Sử dụng XSINIL

Hãy thử điều này để biết các biến thể của emptynull :

DECLARE @x XML=
'<root>
   <testempty1 />
   <testempty2></testempty2>
 </root>';

SELECT @x.value('(/root/testempty1)[1]','nvarchar(max)') AS testempty1_Content
      ,@x.value('(/root/testempty1/text())[1]','nvarchar(max)') AS testempty1_Text
      ,@x.value('(/root/testempty2)[1]','nvarchar(max)') AS testempty2_Content
      ,@x.value('(/root/testempty2/text())[1]','nvarchar(max)') AS testempty2_Text
      ,@x.value('(/root/NotExistingElement)[1]','nvarchar(max)') AS NotExistingElement_Content
      ,@x.value('(/root/NotExistingElement/text())[1]','nvarchar(max)') AS NotExistingElement_Text

Kết quả:

                   Content  Text
testempty1         ""       NULL
testempty2         ""       NULL
NotExistingElement NULL     NULL

Hãy thử điều này cho XSINIL

SELECT NULL AS test FOR XML RAW, ELEMENTS XSINIL

để lấy cái này

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <test xsi:nil="true" />
</row>

Đề xuất của tôi:

Câu hỏi này

hy vọng được giải quyết. Vui lòng bắt đầu một câu hỏi mới trong đó bạn thêm một số dữ liệu khác vào kịch bản mẫu của mình để phản ánh nhiều phần tử con, đặt một liên kết đến câu hỏi này và nêu kết quả mong đợi (XML sẽ trông như thế nào).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi NVARCHAR (255) thành DATE

  2. “Lỗi nghiêm trọng kết nối nội bộ” khi thực thi một quy trình được lưu trữ được biên dịch hoàn toàn trong SQL Server 2019 (Lỗi đã biết)

  3. Các hàm toán học của SQL Server (Danh sách đầy đủ)

  4. Chèn bằng cách sử dụng Trình tự làm trình tạo cho giá trị Khóa chính trong Khung thực thể

  5. Xác định tập hợp con các bản ghi dựa trên ngày và quy tắc trong SQL Server