SQL Server 2012 membuat semua ini lebih mudah dengan TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Untuk versi SQL Server sebelumnya, jawaban yang ada kehilangan beberapa poin yang berarti mereka mungkin tidak cocok dengan string yang sebenarnya akan dilemparkan oleh SQL Server ke UNIQUEIDENTIFIER
tanpa keluhan atau mungkin masih menyebabkan kesalahan pemeran yang tidak valid.
SQL Server menerima GUID baik yang dibungkus dengan {}
atau tanpa ini.
Selain itu mengabaikan karakter asing di akhir string. Keduanya SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
dan SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
berhasil misalnya.
Di sebagian besar susunan default, LIKE '[a-zA-Z0-9]'
akan berakhir dengan karakter yang cocok seperti À
atau Ë
Terakhir, jika casting baris dalam hasil ke uniqueidentifier, penting untuk menempatkan upaya cast dalam ekspresi kasus karena pemeran mungkin terjadi sebelum baris difilter oleh WHERE
.
Jadi (meminjam ide @ r0d30b0y) versi yang sedikit lebih kuat mungkin
;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 + '}%'