2009-08-19 38 views
31

Tôi có tài liệu đã nhập xml được lưu trữ dưới dạng văn bản. Vì vậy, tôi sử dụng CONVERT kiểu dữ liệu thành xml bằng cách sử dụng Biểu thức bảng chung để có thể sử dụng các phương pháp XML:Truy vấn XML() hoạt động, giá trị() yêu cầu singleton tìm thấy xdt: untypedAtomic

WITH xoutput AS (
    SELECT CONVERT(xml, t.requestpayload) 'requestpayload' 
    FROM TABLE t 
    WHERE t.methodid = 1) 
SELECT x.requestpayload.query('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id') as studentid 
    FROM xoutput x 

Công việc truy vấn, trả về phần tử của tôi. Nhưng tôi chỉ quan tâm đến giá trị:

WITH xoutput AS (
    SELECT CONVERT(xml, t.requestpayload) 'requestpayload' 
    FROM TABLE t 
    WHERE t.methodid = 1) 
SELECT x.requestpayload.value('declare namespace s="http://blah.ca/api";/s:validate-student-request/s:student-id', 'int') as studentid 
    FROM xoutput x 

này mang lại cho tôi những lỗi sau:

'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'

Những gì tôi đã googled nói rằng XPATH/XQUERY cần phải được bên trong ngoặc đơn và/hoặc cần "[1]" - cả hai đều không hoạt động. Chỉ có một phần tử sinh viên-id trong xml, mặc dù tôi đoán lược đồ cho phép nhiều hơn?

Ngoài ra, có rất nhiều giá trị phần tử tôi muốn truy xuất - có cách nào để khai báo không gian tên một lần thay vì cho mỗi cuộc gọi phương thức không?

Trả lời

62

Bạn cần phải sử dụng này:

SELECT 
     x.requestpayload.value('declare namespace s="http://blah.ca/api"; 
      (/s:validate-student-request/s:student-id)[1]', 'int') 
    AS 
     studentid 
    FROM 
     xoutput x

Bạn cần phải đặt XPath của bạn trong (...) và thêm một [1] chỉ đơn giản là chọn giá trị đầu tiên của chuỗi đó.

7

Tôi tin rằng điều này cũng có thể làm:

SELECT 
    x.requestpayload.query('declare namespace s="http://blah.ca/api"; 
          /s:validate-student-request/s:student-id').value('.', 'int') 
    as studentid 
FROM xoutput x 
3

Đối với những người quan tâm đến hiệu suất Tôi chạy một truy vấn để so sánh các phương pháp tiếp cận và tùy chọn đầu tiên với "() và thêm một [1]" là MUCH nhanh hơn ".query ('strFranchise'). giá trị ('.', ...)".

Sự khác biệt trong kế hoạch thực hiện là 15% đến 85% khi chạy từng cái một trên cùng một dữ liệu. Vì vậy() [1] nhanh hơn gấp 5 lần! Kế hoạch thực hiện là rất khác nhau.

+0

Khi tôi hiểu nó '[1]' chỉ trả về kết quả đầu tiên trong khi '.value ('.'' Trả về tất cả kết quả. –

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