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

Làm cách nào để kiểm tra xem một chuỗi có phải là mã định danh duy nhất hay không?

SQL Server 2012 làm cho tất cả điều này dễ dàng hơn nhiều với TRY_CONVERT(UNIQUEIDENTIFIER, expression)

SELECT something
FROM   your_table
WHERE  TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;

Đối với các phiên bản trước của SQL Server, các câu trả lời hiện có thiếu một số điểm có nghĩa là chúng có thể không khớp với các chuỗi mà SQL Server trên thực tế sẽ truyền tới UNIQUEIDENTIFIER mà không có khiếu nại hoặc cuối cùng vẫn có thể gây ra lỗi truyền không hợp lệ.

SQL Server chấp nhận các GUID được bao bọc trong {} hoặc không có cái này.

Ngoài ra, nó bỏ qua các ký tự không liên quan ở cuối chuỗi. Cả SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier) thành công chẳng hạn.

Theo hầu hết các ảnh ghép mặc định, LIKE '[a-zA-Z0-9]' sẽ kết thúc các ký tự phù hợp như À hoặc Ë

Cuối cùng, nếu truyền các hàng trong một kết quả đến uniqueidentifier, điều quan trọng là phải đặt nỗ lực ép kiểu trong một biểu thức chữ hoa chữ thường vì quá trình ép kiểu có thể xảy ra trước khi các hàng được lọc bởi WHERE .

Vì vậy, (mượn ý tưởng của @ r0d30b0y) một phiên bản mạnh mẽ hơn một chút có thể là

;WITH T(C)
     AS (SELECT '5D944516-98E6-44C5-849F-9C277833C01B'
         UNION ALL
         SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}'
         UNION ALL
         SELECT '5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
         UNION ALL
         SELECT '{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss'
         UNION ALL
         SELECT 'ÀD944516-98E6-44C5-849F-9C277833C01B'
         UNION ALL
         SELECT 'fish')
SELECT CASE
         WHEN C LIKE expression + '%'
               OR C LIKE '{' + expression + '}%' THEN CAST(C AS UNIQUEIDENTIFIER)
       END
FROM   T
       CROSS APPLY (SELECT REPLACE('00000000-0000-0000-0000-000000000000', '0', '[0-9a-fA-F]') COLLATE Latin1_General_BIN) C2(expression)
WHERE  C LIKE expression + '%'
        OR C LIKE '{' + expression + '}%' 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách TRY_CAST () hoạt động trong SQL Server

  2. Thời gian chờ của truy vấn SQL Server tùy thuộc vào mệnh đề Where

  3. Chuyển đổi ‘smalldatetime’ thành ‘datetime’ trong SQL Server (Ví dụ T-SQL)

  4. Không thể chèn giá trị rõ ràng cho cột nhận dạng trong bảng 'bảng' khi IDENTITY_INSERT được đặt thành TẮT

  5. Giới thiệu về OPENJSON với các ví dụ (SQL Server)