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

SQL Server 2008 R2 - UDF scalare genera un ciclo infinito

SELECT PATINDEX('%[^a-]%', N'aaa-def' COLLATE Latin1_General_BIN),
       PATINDEX('%[^-a]%', N'aaa-def' COLLATE Latin1_General_BIN), 
       PATINDEX('%[^a-]%', 'aaa-def' COLLATE Latin1_General_BIN),
       PATINDEX('%[^-a]%', 'aaa-def' COLLATE Latin1_General_BIN)

Resi

----------- ----------- ----------- -----------
1           5           5           5

Quindi sembra che per varchar tipi di dati un - finale viene considerato come parte di un set mentre per nvarchar viene ignorato (trattato come un intervallo non corretto come a viene ignorato anche lui?)

La voce BOL per MI PIACE non parla esplicitamente di come usare - all'interno di [] per farlo essere trattato come parte di un set ma ha l'esempio

LIKE '[-acdf]'

per abbinare -, a, c, d, or f quindi presumo che debba essere il primo elemento di un set (cioè quel [^a-zA-Z0-9.~_-] deve essere modificato in [^-a-zA-Z0-9.~_] ). Ciò corrisponde anche al risultato dei miei test di cui sopra.