SQL Server 2012では、TRY_CONVERT(UNIQUEIDENTIFIER, expression)
を使用してこれをすべて簡単に行うことができます。
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
以前のバージョンのSQLServerの場合、既存の回答はいくつかの点を見逃しています。つまり、SQLServerが実際にUNIQUEIDENTIFIER
にキャストする文字列と一致しない可能性があります。 苦情なしで、またはそれでも無効なキャストエラーを引き起こす可能性があります。
SQL Serverは、{}
でラップされたGUIDを受け入れます またはこれなし。
さらに、文字列の最後にある無関係な文字を無視します。両方のSELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
およびSELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
たとえば成功します。
ほとんどのデフォルトの照合では、LIKE '[a-zA-Z0-9]'
À
などの一致する文字になります またはË
最後に、結果の行をuniqueidentifierにキャストする場合、行がWHERE
によってフィルタリングされる前にキャストが発生する可能性があるため、case式にキャストの試行を入れることが重要です。 。
したがって、(@ r0d30b0yのアイデアを借りて)もう少し堅牢なバージョンになる可能性があります
;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 + '}%'