Ger*_*iss 17 sql-server t-sql sql-server-2008-r2
检查 VARCHAR 字段是否具有非 Ascii 字符的最佳方法是什么?
CHAR(1)通过CHAR(31)和CHAR(127)通过CHAR(255)。
我尝试使用PATINDEX并遇到了以下问题。
检查下范围是否正常工作。
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Run Code Online (Sandbox Code Playgroud)
我的数据有 0x1E 的三个记录,并且所有三个都返回了。
但是当我只检查上限时:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Run Code Online (Sandbox Code Playgroud)
它返回接近表中的所有记录(表计数 170737 并返回计数 170735),并且由于我的数据在此范围内没有任何值,我认为它不应该返回任何记录。
Mar*_*ith 20
模式语法中的范围使用排序规则的排序规则。
使用二进制 collate 子句,以便按字符代码对范围进行排序。
(我也将其更改为,LIKE因为我发现它比 更明显PATINDEX > 0)
SELECT *
FROM mbrnotes
WHERE LINE_TEXT LIKE '%[' + CHAR(127)+ '-' +CHAR(255)+']%' COLLATE Latin1_General_100_BIN2
Run Code Online (Sandbox Code Playgroud)
如果您像我一样,并且多年来您已经厌倦了在公司糟糕的数据中搜索这些字符,那么您可以使用此函数或根据自己的目的重写它。诚然,它很冗长,但如果您愿意,它会执行识别特殊字符的额外步骤 - 取消注释第 19 - 179 行即可。
\n\n如果字符串不包含不可打印或扩展的 ascii 值 - 则返回 NULL。
\n\nCREATE FUNCTION [dbo].[Find_Invalid_Chars]\n(\n @SearchString VARCHAR(8000)\n)\nRETURNS VARCHAR(8000)\nAS\nBEGIN\n DECLARE @CharPosition INT, @CharVal VARCHAR(100), @ReturnVal VARCHAR(8000) = \'\', @isValid BIT = 1 -- Start as valid\n\n SET @CharPosition = 1\n\n WHILE @CharPosition <= DATALENGTH(@SearchString)\n BEGIN\n IF (ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) NOT BETWEEN (32) AND (127))\n BEGIN\n SET @CharVal = \'[\' + CAST(ASCII(SUBSTRING(@SearchString, @CharPosition, 1)) AS VARCHAR(3)) + \']\'\n SET @isValid = 0\n ---- Non-Printables\n --SET @CharVal = REPLACE(@CharVal, \'[0]\', \'[NUL]\')\n --SET @CharVal = REPLACE(@CharVal, \'[1]\', \'[SOH]\')\n --SET @CharVal = REPLACE(@CharVal, \'[2]\', \'[STX]\')\n --SET @CharVal = REPLACE(@CharVal, \'[3]\', \'[ETX]\')\n --SET @CharVal = REPLACE(@CharVal, \'[4]\', \'[EOT]\')\n --SET @CharVal = REPLACE(@CharVal, \'[5]\', \'[ENQ]\')\n --SET @CharVal = REPLACE(@CharVal, \'[6]\', \'[ACK]\')\n --SET @CharVal = REPLACE(@CharVal, \'[7]\', \'[BEL]\')\n --SET @CharVal = REPLACE(@CharVal, \'[8]\', \'[BS]\')\n --SET @CharVal = REPLACE(@CharVal, \'[9]\', \'[HT]\')\n --SET @CharVal = REPLACE(@CharVal, \'[10]\', \'[LF]\')\n --SET @CharVal = REPLACE(@CharVal, \'[11]\', \'[VT]\')\n --SET @CharVal = REPLACE(@CharVal, \'[12]\', \'[FF]\')\n --SET @CharVal = REPLACE(@CharVal, \'[13]\', \'[CR]\')\n --SET @CharVal = REPLACE(@CharVal, \'[14]\', \'[SO]\')\n --SET @CharVal = REPLACE(@CharVal, \'[15]\', \'[SI]\')\n --SET @CharVal = REPLACE(@CharVal, \'[16]\', \'[DLE]\')\n --SET @CharVal = REPLACE(@CharVal, \'[17]\', \'[DC1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[18]\', \'[DC2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[19]\', \'[DC3]\')\n --SET @CharVal = REPLACE(@CharVal, \'[20]\', \'[DC4]\')\n --SET @CharVal = REPLACE(@CharVal, \'[21]\', \'[NAK]\')\n --SET @CharVal = REPLACE(@CharVal, \'[22]\', \'[SYN]\')\n --SET @CharVal = REPLACE(@CharVal, \'[23]\', \'[ETB]\')\n --SET @CharVal = REPLACE(@CharVal, \'[24]\', \'[CAN]\')\n --SET @CharVal = REPLACE(@CharVal, \'[25]\', \'[EM]\')\n --SET @CharVal = REPLACE(@CharVal, \'[26]\', \'[SUB]\')\n --SET @CharVal = REPLACE(@CharVal, \'[27]\', \'[ESC]\')\n --SET @CharVal = REPLACE(@CharVal, \'[28]\', \'[FS]\')\n --SET @CharVal = REPLACE(@CharVal, \'[29]\', \'[GS]\')\n --SET @CharVal = REPLACE(@CharVal, \'[30]\', \'[RS]\')\n --SET @CharVal = REPLACE(@CharVal, \'[31]\', \'[US]\')\n ---- Extended Ascii\n --SET @CharVal = REPLACE(@CharVal, \'[128]\', \'[\xe2\x82\xac]\')\n --SET @CharVal = REPLACE(@CharVal, \'[129]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[130]\', \'[\xe2\x80\x9a]\')\n --SET @CharVal = REPLACE(@CharVal, \'[131]\', \'[\xc6\x92]\')\n --SET @CharVal = REPLACE(@CharVal, \'[132]\', \'[\xe2\x80\x9e]\')\n --SET @CharVal = REPLACE(@CharVal, \'[133]\', \'[\xe2\x80\xa6]\')\n --SET @CharVal = REPLACE(@CharVal, \'[134]\', \'[\xe2\x80\xa0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[135]\', \'[\xe2\x80\xa1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[136]\', \'[\xcb\x86]\')\n --SET @CharVal = REPLACE(@CharVal, \'[137]\', \'[\xe2\x80\xb0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[138]\', \'[\xc5\xa0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[139]\', \'[\xe2\x80\xb9]\')\n --SET @CharVal = REPLACE(@CharVal, \'[140]\', \'[\xc5\x92]\')\n --SET @CharVal = REPLACE(@CharVal, \'[141]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[142]\', \'[\xc5\xbd]\')\n --SET @CharVal = REPLACE(@CharVal, \'[143]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[144]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[145]\', \'[\xe2\x80\x98]\')\n --SET @CharVal = REPLACE(@CharVal, \'[146]\', \'[\xe2\x80\x99]\')\n --SET @CharVal = REPLACE(@CharVal, \'[147]\', \'[\xe2\x80\x9c]\')\n --SET @CharVal = REPLACE(@CharVal, \'[148]\', \'[\xe2\x80\x9d]\')\n --SET @CharVal = REPLACE(@CharVal, \'[149]\', \'[\xe2\x80\xa2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[150]\', \'[\xe2\x80\x93]\')\n --SET @CharVal = REPLACE(@CharVal, \'[151]\', \'[\xe2\x80\x94]\')\n --SET @CharVal = REPLACE(@CharVal, \'[152]\', \'[\xcb\x9c]\')\n --SET @CharVal = REPLACE(@CharVal, \'[153]\', \'[\xe2\x84\xa2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[154]\', \'[\xc5\xa1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[155]\', \'[\xe2\x80\xba]\')\n --SET @CharVal = REPLACE(@CharVal, \'[156]\', \'[\xc5\x93]\')\n --SET @CharVal = REPLACE(@CharVal, \'[157]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[158]\', \'[\xc5\xbe]\')\n --SET @CharVal = REPLACE(@CharVal, \'[159]\', \'[\xc5\xb8]\')\n --SET @CharVal = REPLACE(@CharVal, \'[160]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[161]\', \'[\xc2\xa1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[162]\', \'[\xc2\xa2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[163]\', \'[\xc2\xa3]\')\n --SET @CharVal = REPLACE(@CharVal, \'[164]\', \'[\xc2\xa4]\')\n --SET @CharVal = REPLACE(@CharVal, \'[165]\', \'[\xc2\xa5]\')\n --SET @CharVal = REPLACE(@CharVal, \'[166]\', \'[\xc2\xa6]\')\n --SET @CharVal = REPLACE(@CharVal, \'[167]\', \'[\xc2\xa7]\')\n --SET @CharVal = REPLACE(@CharVal, \'[168]\', \'[\xc2\xa8]\')\n --SET @CharVal = REPLACE(@CharVal, \'[169]\', \'[\xc2\xa9]\')\n --SET @CharVal = REPLACE(@CharVal, \'[170]\', \'[\xc2\xaa]\')\n --SET @CharVal = REPLACE(@CharVal, \'[171]\', \'[\xc2\xab]\')\n --SET @CharVal = REPLACE(@CharVal, \'[172]\', \'[\xc2\xac]\')\n --SET @CharVal = REPLACE(@CharVal, \'[173]\', \'[]]\')\n --SET @CharVal = REPLACE(@CharVal, \'[174]\', \'[\xc2\xae]\')\n --SET @CharVal = REPLACE(@CharVal, \'[175]\', \'[\xc2\xaf]\')\n --SET @CharVal = REPLACE(@CharVal, \'[176]\', \'[\xc2\xb0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[177]\', \'[\xc2\xb1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[178]\', \'[\xc2\xb2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[179]\', \'[\xc2\xb3]\')\n --SET @CharVal = REPLACE(@CharVal, \'[180]\', \'[\xc2\xb4]\')\n --SET @CharVal = REPLACE(@CharVal, \'[181]\', \'[\xc2\xb5]\')\n --SET @CharVal = REPLACE(@CharVal, \'[182]\', \'[\xc2\xb6]\')\n --SET @CharVal = REPLACE(@CharVal, \'[183]\', \'[\xc2\xb7]\')\n --SET @CharVal = REPLACE(@CharVal, \'[184]\', \'[\xc2\xb8]\')\n --SET @CharVal = REPLACE(@CharVal, \'[185]\', \'[\xc2\xb9]\')\n --SET @CharVal = REPLACE(@CharVal, \'[186]\', \'[\xc2\xba]\')\n --SET @CharVal = REPLACE(@CharVal, \'[187]\', \'[\xc2\xbb]\')\n --SET @CharVal = REPLACE(@CharVal, \'[188]\', \'[\xc2\xbc]\')\n --SET @CharVal = REPLACE(@CharVal, \'[189]\', \'[\xc2\xbd]\')\n --SET @CharVal = REPLACE(@CharVal, \'[190]\', \'[\xc2\xbe]\')\n --SET @CharVal = REPLACE(@CharVal, \'[191]\', \'[\xc2\xbf]\')\n --SET @CharVal = REPLACE(@CharVal, \'[192]\', \'[\xc3\x80]\')\n --SET @CharVal = REPLACE(@CharVal, \'[193]\', \'[\xc3\x81]\')\n --SET @CharVal = REPLACE(@CharVal, \'[194]\', \'[\xc3\x82]\')\n --SET @CharVal = REPLACE(@CharVal, \'[195]\', \'[\xc3\x83]\')\n --SET @CharVal = REPLACE(@CharVal, \'[196]\', \'[\xc3\x84]\')\n --SET @CharVal = REPLACE(@CharVal, \'[197]\', \'[\xc3\x85]\')\n --SET @CharVal = REPLACE(@CharVal, \'[198]\', \'[\xc3\x86]\')\n --SET @CharVal = REPLACE(@CharVal, \'[199]\', \'[\xc3\x87]\')\n --SET @CharVal = REPLACE(@CharVal, \'[200]\', \'[\xc3\x88]\')\n --SET @CharVal = REPLACE(@CharVal, \'[201]\', \'[\xc3\x89]\')\n --SET @CharVal = REPLACE(@CharVal, \'[202]\', \'[\xc3\x8a]\')\n --SET @CharVal = REPLACE(@CharVal, \'[203]\', \'[\xc3\x8b]\')\n --SET @CharVal = REPLACE(@CharVal, \'[204]\', \'[\xc3\x8c]\')\n --SET @CharVal = REPLACE(@CharVal, \'[205]\', \'[\xc3\x8d]\')\n --SET @CharVal = REPLACE(@CharVal, \'[206]\', \'[\xc3\x8e]\')\n --SET @CharVal = REPLACE(@CharVal, \'[207]\', \'[\xc3\x8f]\')\n --SET @CharVal = REPLACE(@CharVal, \'[208]\', \'[\xc3\x90]\')\n --SET @CharVal = REPLACE(@CharVal, \'[209]\', \'[\xc3\x91]\')\n --SET @CharVal = REPLACE(@CharVal, \'[210]\', \'[\xc3\x92]\')\n --SET @CharVal = REPLACE(@CharVal, \'[211]\', \'[\xc3\x93]\')\n --SET @CharVal = REPLACE(@CharVal, \'[212]\', \'[\xc3\x94]\')\n --SET @CharVal = REPLACE(@CharVal, \'[213]\', \'[\xc3\x95]\')\n --SET @CharVal = REPLACE(@CharVal, \'[214]\', \'[\xc3\x96]\')\n --SET @CharVal = REPLACE(@CharVal, \'[215]\', \'[\xc3\x97]\')\n --SET @CharVal = REPLACE(@CharVal, \'[216]\', \'[\xc3\x98]\')\n --SET @CharVal = REPLACE(@CharVal, \'[217]\', \'[\xc3\x99]\')\n --SET @CharVal = REPLACE(@CharVal, \'[218]\', \'[\xc3\x9a]\')\n --SET @CharVal = REPLACE(@CharVal, \'[219]\', \'[\xc3\x9b]\')\n --SET @CharVal = REPLACE(@CharVal, \'[220]\', \'[\xc3\x9c]\')\n --SET @CharVal = REPLACE(@CharVal, \'[221]\', \'[\xc3\x9d]\')\n --SET @CharVal = REPLACE(@CharVal, \'[222]\', \'[\xc3\x9e]\')\n --SET @CharVal = REPLACE(@CharVal, \'[223]\', \'[\xc3\x9f]\')\n --SET @CharVal = REPLACE(@CharVal, \'[224]\', \'[\xc3\xa0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[225]\', \'[\xc3\xa1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[226]\', \'[\xc3\xa2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[227]\', \'[\xc3\xa3]\')\n --SET @CharVal = REPLACE(@CharVal, \'[228]\', \'[\xc3\xa4]\')\n --SET @CharVal = REPLACE(@CharVal, \'[229]\', \'[\xc3\xa5]\')\n --SET @CharVal = REPLACE(@CharVal, \'[230]\', \'[\xc3\xa6]\')\n --SET @CharVal = REPLACE(@CharVal, \'[231]\', \'[\xc3\xa7]\')\n --SET @CharVal = REPLACE(@CharVal, \'[232]\', \'[\xc3\xa8]\')\n --SET @CharVal = REPLACE(@CharVal, \'[233]\', \'[\xc3\xa9]\')\n --SET @CharVal = REPLACE(@CharVal, \'[234]\', \'[\xc3\xaa]\')\n --SET @CharVal = REPLACE(@CharVal, \'[235]\', \'[\xc3\xab]\')\n --SET @CharVal = REPLACE(@CharVal, \'[236]\', \'[\xc3\xac]\')\n --SET @CharVal = REPLACE(@CharVal, \'[237]\', \'[\xc3\xad]\')\n --SET @CharVal = REPLACE(@CharVal, \'[238]\', \'[\xc3\xae]\')\n --SET @CharVal = REPLACE(@CharVal, \'[239]\', \'[\xc3\xaf]\')\n --SET @CharVal = REPLACE(@CharVal, \'[240]\', \'[\xc3\xb0]\')\n --SET @CharVal = REPLACE(@CharVal, \'[241]\', \'[\xc3\xb1]\')\n --SET @CharVal = REPLACE(@CharVal, \'[242]\', \'[\xc3\xb2]\')\n --SET @CharVal = REPLACE(@CharVal, \'[243]\', \'[\xc3\xb3]\')\n --SET @CharVal = REPLACE(@CharVal, \'[244]\', \'[\xc3\xb4]\')\n --SET @CharVal = REPLACE(@CharVal, \'[245]\', \'[\xc3\xb5]\')\n --SET @CharVal = REPLACE(@CharVal, \'[246]\', \'[\xc3\xb6]\')\n --SET @CharVal = REPLACE(@CharVal, \'[247]\', \'[\xc3\xb7]\')\n --SET @CharVal = REPLACE(@CharVal, \'[248]\', \'[\xc3\xb8]\')\n --SET @CharVal = REPLACE(@CharVal, \'[249]\', \'[\xc3\xb9]\')\n --SET @CharVal = REPLACE(@CharVal, \'[250]\', \'[\xc3\xba]\')\n --SET @CharVal = REPLACE(@CharVal, \'[251]\', \'[\xc3\xbb]\')\n --SET @CharVal = REPLACE(@CharVal, \'[252]\', \'[\xc3\xbc]\')\n --SET @CharVal = REPLACE(@CharVal, \'[253]\', \'[\xc3\xbd]\')\n --SET @CharVal = REPLACE(@CharVal, \'[254]\', \'[\xc3\xbe]\')\n --SET @CharVal = REPLACE(@CharVal, \'[255]\', \'[\xc3\xbf]\')\n END\n ELSE\n BEGIN\n SET @CharVal = SUBSTRING(@SearchString, @CharPosition, 1)\n END\n\n SET @ReturnVal = @ReturnVal + @CharVal\n\n SET @CharPosition = @CharPosition + 1\n END\n\nIF (@isValid = 1) SET @ReturnVal = NULL\n\nRETURN @ReturnVal\n\nEND\nRun Code Online (Sandbox Code Playgroud)\n\n然后,这样称呼它:
\n\nSELECT BadString, dbo.Find_Invalid_Chars(BadString) [Invalid Characters]\nFROM #tmp_Table tmp_mc\nWHERE dbo.Find_Invalid_Chars(BadString) IS NOT NULL\nRun Code Online (Sandbox Code Playgroud)\n\n示例输出:
\n\n\n\n或者
\n\n\n| 归档时间: |
|
| 查看次数: |
53274 次 |
| 最近记录: |