2012-01-20 33 views
1

TSQL patindex中CHAR(13)或CHAR(14)的问题是什么? 只要我将CHAR(14)包含在一个模式中,就没有找到记录。 寻找答案,我刚刚发现自己的问题(未答复)从2009年(这里:http://www.sqlservercentral.com/Forums/Topic795063-338-1.aspx)。CHAR(14)不允许在SQL Server T-SQL patindex范围内?

这里是另一个简单的测试,来说明我的意思:

/* PATINDEX TEST */ 
DECLARE @msg NVARCHAR(255) 
SET @msg = 'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' 

DECLARE @unwanted NVARCHAR(50) 
-- unwanted chars in a "chopped up" string 
SET @unwanted = N'%[' + NCHAR(1) + '-' + NCHAR(13) + NCHAR(14) + '-' + NCHAR(31) + ']%' 
SELECT patindex(@unwanted, @msg) 

- 结果:4

-- NOW LET THE unwanted string includ the whole range from 1 to 31 


    SET @unwanted = '%['+NCHAR(1)+'-'+NCHAR(31)+']%' -- -- As soon as Char(14) is included, we get no match with patindex! 
    SELECT patindex(@unwanted, @msg) 

- 结果:0

回答

6

这是允许的。

您需要注意的是,范围是基于排序规则排序顺序而不是字符代码,因此可能在默认排序规则中,排序在您不期望的位置。

什么是数据库的默认排序规则?

以下情况会返回什么结果?

;WITH CTE(N) AS 
(
SELECT 1 UNION ALL 
SELECT 9 UNION ALL 
SELECT 13 UNION ALL 
SELECT 14 UNION ALL 
SELECT 31 
) 
SELECT N 
FROM CTE 
ORDER BY NCHAR(N) 

对于我来说,返回

N 
----------- 
1 
14 
31 
9 
13 

所以这两个字符9和13的范围之外1-31。因此,

'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' NOT LIKE N'%['+NCHAR(1)+N'-'+NCHAR(31)+N']%' 

这解释了您的问题的结果。角色14没有进入它。

您可以使用二进制collat​​e子句按照您的预期排序。例如

SELECT patindex(@unwanted COLLATE Latin1_General_100_BIN, @msg) 

还在第二查询中返回4

+0

我的排序规则是Finnish_Swedish_CI_AS,您的CTE以相同的顺序为我返回结果。我从来没有想过,低于32的字符可能会有不同的顺序,并且依赖于排序规则!谢谢! –

+0

很高兴知道这一点。谢谢。 – abhi