SQL Server 2012 rende tutto molto più semplice con TRY_CONVERT(UNIQUEIDENTIFIER, expression)
SELECT something
FROM your_table
WHERE TRY_CONVERT(UNIQUEIDENTIFIER, your_column) IS NOT NULL;
Per le versioni precedenti di SQL Server, le risposte esistenti mancano di alcuni punti, il che significa che potrebbero non corrispondere alle stringhe che SQL Server eseguirà effettivamente il cast su UNIQUEIDENTIFIER
senza reclamo o potrebbe comunque causare errori di trasmissione non validi.
SQL Server accetta GUID racchiusi in {}
o senza questo.
Ignora inoltre i caratteri estranei alla fine della stringa. Entrambi SELECT CAST('{5D944516-98E6-44C5-849F-9C277833C01B}ssssssssss' as uniqueidentifier)
e SELECT CAST('5D944516-98E6-44C5-849F-9C277833C01BXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' as uniqueidentifier)
riuscire ad esempio.
Nella maggior parte delle regole di confronto predefinite LIKE '[a-zA-Z0-9]'
finirà per abbinare caratteri come À
o Ë
Infine, se si esegue il cast di righe in un risultato su uniqueidentifier, è importante inserire il tentativo di cast in un'espressione case poiché il cast potrebbe verificarsi prima che le righe vengano filtrate da WHERE
.
Quindi (prendendo in prestito l'idea di @r0d30b0y) potrebbe essere una versione leggermente più robusta
;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 + '}%'