Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come verificare se una stringa è un identificatore univoco?

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