Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server 2008 R2 – Scalar UDF führt zu einer Endlosschleife

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)

Rückgabe

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

So scheint es für varchar Datentypen ein nachgestellter - wird als Teil einer Menge behandelt, wohingegen für nvarchar er wird ignoriert (als falsch formatierter Bereich als a behandelt wird auch ignoriert?)

Der BOL-Eintrag für LIKE spricht nicht explizit über die Verwendung von - innerhalb von [] um es als Teil einer Menge zu behandeln, hat aber das Beispiel

LIKE '[-acdf]'

um mit -, a, c, d, or f übereinzustimmen also gehe ich davon aus, dass es das erste Element in einem Satz sein muss (d.h. dass [^a-zA-Z0-9.~_-] muss in [^-a-zA-Z0-9.~_] geändert werden ). Das stimmt auch mit dem Ergebnis meiner obigen Tests überein.