Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

SQL Server:chuyển đổi có điều kiện nội tuyến với XML?

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.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt DefaultDataPath và DefaultLogPath khi triển khai trong dự án cơ sở dữ liệu VS2010

  2. TSQL 2005, XML DML - Cập nhật hai giá trị cùng một lúc?

  3. Trường hợp trong Tuyên bố Chọn

  4. Cơ bản và cách sử dụng gợi ý NOLOCK trong SQL Server

  5. Trục động T-SQL