Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2008 R2 - UDF scalaire entraîne une boucle infinie

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)

Retours

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

Il semble donc que pour varchar types de données un - final est traité comme faisant partie d'un ensemble alors que pour nvarchar il est ignoré (traité comme une plage malformée comme a est également ignoré ?)

L'entrée BOL pour LIKE ne parle pas explicitement de la façon d'utiliser - dans [] pour qu'il soit traité comme faisant partie d'un ensemble mais a l'exemple

LIKE '[-acdf]'

pour correspondre à -, a, c, d, or f donc je suppose qu'il doit être le premier élément d'un ensemble (c'est-à-dire que [^a-zA-Z0-9.~_-] doit être modifié en [^-a-zA-Z0-9.~_] ). Cela correspond également au résultat de mes tests ci-dessus.