Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008 R2 - UDF escalar resulta em loop 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)

Devoluções
----------- ----------- ----------- -----------
1           5           5           5

Então parece que para varchar tipos de dados um - à direita é tratado como parte de um conjunto enquanto para nvarchar ele é ignorado (tratado como um intervalo malformado como a é ignorado também?)

A entrada BOL para LIKE não fala explicitamente sobre como usar - dentro de [] para que seja tratado como parte de um conjunto, mas tem o exemplo
LIKE '[-acdf]'

para corresponder a -, a, c, d, or f então eu suponho que ele precisa ser o primeiro item em um conjunto (ou seja, que [^a-zA-Z0-9.~_-] precisa ser alterado para [^-a-zA-Z0-9.~_] ). Isso também corresponde ao resultado do meu teste acima.