2010-09-22 45 views
7

Vì vậy, tôi có một cột varbinary(max) trong SQL Server 2005 và nó đầy XML. Một vài bản ghi ở đâu đó đã cắt ngắn XML để chúng không hợp lệ.XML không hợp lệ trong cột varbinary (max) trong SQL Server 2005

Điều này có nghĩa nếu tôi chạy một

SELECT CAST(myVarbinaryColumn as XML) ... 

nó thổi khối.

Làm cách nào để lọc/bỏ qua xml không hợp lệ?

Khi tôi đã thực hiện tương tự với một varchar được cho là có ngày tôi có thể sử dụng ISDATE(blah) = 1. Vì vậy, một tương đương ISVALIDXML() sẽ là tốt đẹp.

Xin vui lòng không bình luận về "Tại sao không phải là kiểu dữ liệu XML cột anyway .." Điều này xảy ra trong quá khứ và tôi không có một cỗ máy thời gian.

+0

Hmm thú vị, byte cuối cùng sẽ luôn giống nhau vì vậy tôi có thể lọc ra những byte không khớp? May mắn trong kịch bản này, tất cả xml đều sử dụng cùng một lược đồ để tất cả chúng đều có phần tử gốc đóng phù hợp –

Trả lời

1

Tôi nghĩ đặt cược tốt nhất của bạn là viết CLR function tùy chỉnh, có thể sử dụng XmlDocument.Load. Trong CLR, bạn có thể bẫy lỗi khi tải không thành công và trả lại kết quả phù hợp.

EDIT: Mã bên dưới cũng sẽ hoạt động mặc dù nó không thanh lịch như UDF. Thật không may, chúng tôi không thể sử dụng TRY/CATCH trong UDF.

create procedure dbo.usp_IsValidXML(@XMLCandidate varbinary(max), @Return bit output) 
as 
begin 
    declare @x xml 
    begin try 
     set @x = cast(@XMLCandidate as xml) 
     set @Return = 1 
    end try 
    begin catch 
     set @Return = 0 
    end catch 
end 
go 

declare @test1 varbinary(max) 
declare @test2 varbinary(max) 
set @test1 = cast('<data>asdf</data>' as varbinary(max)) 
set @test2 = cast('<data>asdf</da' as varbinary(max)) 

declare @IsValid bit 
exec dbo.usp_IsValidXML @test1, @IsValid output 
select @IsValid 
exec dbo.usp_IsValidXML @test2, @IsValid output 
select @IsValid 

drop procedure dbo.usp_IsValidXML 
+0

Có và tạo cột được tính liên tục dựa trên nó, vì vậy nó không được gọi mỗi khi bạn đi 'where valid_xml = 1'. – GSerg

+0

Nó sẽ được xác định? –

1

Tôi ước gì có mà IsValidXML() chức năng, quá ..... không may, tôi không nghĩ rằng có bất cứ điều gì như thế .....

Chỉ cần một ý nghĩ: có điều gì bạn có thể kiểm tra để lọc XML không hợp lệ ??

Ví dụ: bạn có thể lọc ra tất cả các chuỗi không kết thúc bằng .....</data> hoặc một cái gì đó tương tự không? (thấy rằng bạn nói XML không hợp lệ của bạn thường được cắt ngắn XML, vì vậy tôi sẽ nghĩ thẻ đóng - </data> hoặc bất kỳ thứ gì - sẽ bị thiếu trong các trường hợp đó).

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