And*_*son 1 t-sql sql-server pattern-matching patindex
在TSQL patindex中CHAR(13)或CHAR(14)有什么问题?一旦我在模式中包含CHAR(14),我就找不到记录.寻找答案,我刚从2009年找到了我自己的问题(未答复)(此处:http://www.sqlservercentral.com/Forums/Topic795063-338-1.aspx).
这是另一个简单的测试,以显示我的意思:
/* 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)
Run Code Online (Sandbox Code Playgroud)
- 结果: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)
Run Code Online (Sandbox Code Playgroud)
- 结果:0
这是允许的.
您需要记住,范围是基于排序规则排序顺序而不是字符代码,但是在您的默认排序规则中,它可能会排在您不期望的位置.
您的数据库的默认排序规则是什么?
以下是什么回报?
;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)
Run Code Online (Sandbox Code Playgroud)
对我来说它会回来
N
-----------
1
14
31
9
13
Run Code Online (Sandbox Code Playgroud)
因此,字符9和13都在1-31范围之外.于是
'ABC' + NCHAR(13) + NCHAR(9) + 'DEF' NOT LIKE N'%['+NCHAR(1)+N'-'+NCHAR(31)+N']%'
Run Code Online (Sandbox Code Playgroud)
这解释了你问题的结果.角色14不会进入它.
您可以使用二进制整理子句使其按您的预期排序.例如
SELECT patindex(@unwanted COLLATE Latin1_General_100_BIN, @msg)
Run Code Online (Sandbox Code Playgroud)
4也在第二个查询中返回.