2012-01-20 72 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