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)
và 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 + '}%'