Dữ liệu XML của bạn chưa hoàn chỉnh - nó sử dụng tiền tố không gian tên ns0
mà không cần xác định nó ở bất kỳ đâu ... Tôi đã thêm một số không gian tên XML hoàn toàn tùy ý ở đây trong mẫu của mình - bạn cần kiểm tra không gian tên XML đó thực sự là gì trong trường hợp của bạn và điều chỉnh mẫu cho phù hợp!
Hãy thử điều này:
DECLARE @InputTable TABLE (ID INT NOT NULL, XmlData XML)
INSERT INTO @InputTable(ID, XmlData) VALUES(42, '<?xml version="1.0" encoding="UTF-8" ?>
<ns0:Root xmlns:ns0="urn:some-sample-xml-namespace">
<ns0:Result>
<ns0:AStatus>Aaa</ns0:AStatus>
<ns0:BStatus>Bbb</ns0:BStatus>
</ns0:Result>
</ns0:Root>')
-- define the XML namespace to use
;WITH XMLNAMESPACES('urn:some-sample-xml-namespace' AS x)
SELECT
ID,
XC.value('(x:AStatus)[1]', 'varchar(50)')
FROM
@inputtable
CROSS APPLY
-- get a "pseudo" table of nodes <ns0:Root>/<ns0:Result>
XmlData.nodes('x:Root/x:Result') AS XT(XC)
Về cơ bản, bạn cần có định nghĩa cho tiền tố không gian tên XML của bạn - và trong SELECT
đối với dữ liệu XML này, bạn cần phải có giống nhau Không gian tên XML (mặc dù - như được hiển thị - tiền tố được gán cho không gian tên đó có thể khác - nhưng không gian tên phải khớp!).
Thao tác này sau đó chọn dữ liệu từ bảng và đối với dữ liệu XML, nó sử dụng .nodes()
Hàm XQuery để lấy danh sách phần tử XML phù hợp với biểu thức XPath này - và nó lấy các nút này dưới dạng bảng giả trong bộ nhớ XT
với một cột XML duy nhất XC
từ đó bạn có thể tìm nạp lại các giá trị (như tiếp cận với <ns:AStatus>
đầu tiên phần tử).