2013-07-30 50 views
8

Tôi có một số giá trị xml hợp lệ và không hợp lệ được lưu trữ trong cột VARCHAR.t-sql: chuyển đổi varchar thành xml

Tôi muốn truyền các giá trị xml hợp lệ vào loại dữ liệu xml thực tế và không hợp lệ thành giá trị rỗng.

Cách hay để làm điều này là gì?

Cái gì như:

SELECT 
    CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML) 
    ELSE null 
END 
+0

gì phiên bản của SQL Server? –

+0

Microsoft SQL Server 2008 (SP1) – David

+1

Bạn không thể chạy một tiến trình trong quá trình tải ** của dữ liệu này để từ chối XML không hợp lệ, nếu không bạn đang chạy truy vấn này qua một hàm mỗi lần bạn sử dụng câu lệnh chọn này lý tưởng cho hiệu suất. – christiandev

Trả lời

0

Nếu bạn cần phải giữ cho XML dù hợp lý hay không, bạn có thể có một cờ trên bàn như IsValid (bit). Quá trình tải sau đó có thể thực hiện kiểm tra một lần trên dữ liệu này để kiểm tra xem XML có hợp lệ không và đặt cờ dựa trên kết quả. Bằng cách này bạn có thể nhận được XML hợp lệ bằng cách sử dụng các truy vấn:

SELECT 
    CASE WHEN IsValid = 1 THEN CAST(xml_data as XML) 
    ELSE null 
END 

Nếu bạn không cần phải giữ XML không hợp lệ, sau đó chỉ cần loại bỏ nó trong việc bốc hàng, thiết lập hiện trường để NULL, vì vậy truy vấn sẽ xem xét như:

SELECT 
    CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML) 
    ELSE null 
END 

Cả hai cách sẽ cho hiệu suất tốt hơn mà đi qua một SQL function cho mỗi truy vấn.

+1

Có, nhưng thịt bò của câu hỏi của tôi là làm thế nào để tôi kiểm tra là XML là hợp lệ ở nơi đầu tiên? – David

+0

'Tôi có một số giá trị xml hợp lệ và không hợp lệ được lưu trữ trong cột varchar.' - là bước lưu trữ này dưới sự kiểm soát của bạn? hoặc bạn đang truy vấn một bảng được điền trước? – christiandev

+0

bảng đã được chuẩn bị trước. Về cơ bản, tôi cần một cách để kiểm tra tính hợp lệ của chuỗi XML bằng cách sử dụng t-sql. – David

4

Đáp lại chỉ sau:

Có, nhưng thịt bò của câu hỏi của tôi là làm thế nào để kiểm tra là XML là hợp lệ trong nơi đầu tiên?

là XML của bạn không hợp lệ theo nghĩa là bạn sẽ được nghỉ ngơi như dòng thứ hai dưới đây:

SELECT CAST('<xml>Yep this is xml</xml>' AS XML) 
SELECT CAST('<xml>Nope, not xml</x' AS XML) 

Một giải pháp tôi thấy là một cách tiếp cận hàng-by-hàng, nơi bạn cố gắng và CAST một hàng là XML và nếu nó hoạt động như XML chèn thành công hàng hợp lệ vào một bảng có giá trị XML hợp lệ, nếu giá trị đó không được truyền chính xác thì giá trị sẽ không được chèn. See this thread for examples.

+1

Cảm ơn bạn đã liên kết đến chủ đề khác, nơi đề xuất phân tích cú pháp mã thông báo được đề cập theo cách thủ công. Đó là những gì tôi đã làm. – Alan

1

Cố gắng sử dụng sp_xml_preparedocument -

SET NOCOUNT ON; 

DECLARE @XML NVARCHAR(MAX) 
SELECT @XML = '<t>test</' 

DECLARE @hDoc INT 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

SELECT @XML = '<t>test</t>' 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

Output -

------------------------- 
"<t>test</" is invalid 

------------------------- 
"<t>test</t>" is valid 
Các vấn đề liên quan