Có vẻ như bạn cần một phiên bản của ISNUMERIC chức năng cho dữ liệu XML.
Rất tiếc, không có chức năng tích hợp nào như vậy tồn tại - vì vậy bạn sẽ phải nghĩ ra phương án thay thế của riêng mình, có một số tùy chọn:
Nếu đây là quy trình một lần hoặc quy mô nhỏ mà hiệu suất không quan trọng, bạn có thể xử lý các bảng nhập từng hàng một bên trong con trỏ, bằng cách sử dụng TRY...CATCH
khối để xử lý các phôi không hợp lệ (chưa được kiểm tra):
DECLARE xmlCur CURSOR FOR
SELECT textcol
FROM inputTable
OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml
FETCH NEXT FROM xmlCur into @string
WHILE @@fetch_status = 0
BEGIN
BEGIN TRY
SET @xml = CAST(@string AS XML)
-- Do something with XML
END TRY
BEGIN CATCH
-- log failure/mark source row as invalid
END CATCH
FETCH NEXT FROM xmlCur into @string
END
CLOSE xmlCur
DEALLOCATE xmlCur
Ngoài ra, nếu bạn cảm thấy thoải mái với lập trình .Net (và nó được bật trên máy chủ của bạn), bạn có thể sử dụng CLR để tạo hàm IsXML của riêng bạn. Mã .Net sẽ không phức tạp hơn nhiều so với bài đăng thứ ba trên chuỗi này .
Hiệu suất của giải pháp CLR có thể không tốt hơn nhiều so với con trỏ - bạn cần phải kiểm tra để thiết lập điều này.
(Một điều hiển nhiên để thử, nhưng không hoạt động, là một hàm T-SQL có giá trị vô hướng sẽ cố gắng truyền trường sang XML bên trong TRY...CATCH
khối. Tuy nhiên, TRY...CATCH
không được phép bên trong một hàm.)