2017-04-10 31 views
1

我有一張表,其中包含我想擺脫的特殊字符。查找表中的特殊字符並將其刪除

例子:

enter image description here

這是文本(我粘貼了PIC因爲字符是不可見的純文字版)

enominazione AOC. I vini di b 

我已經得到了ASCII該字符的代碼使用ASCII()函數,並返回11

問題是,當我執行此查詢:

DECLARE @specharfilter NVARCHAR(10) = CHAR(11); 
SELECT * FROM My_Table WHERE [Text] like N'%' + @specharfilter + N'%' 

我沒有得到任何結果。另一方面,當我嘗試使用另一個ascii代碼(如70)時,我得到了結果。

那麼我做錯了什麼?謝謝你的幫助。

+1

我不能重現這個問題,似乎工作UDF對我來說很好:http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=1a14f370e4681536a20250bd51f6ab5d你也意識到你填充變量但從來沒有真正使用它? – GarethD

+1

即使使用您的編輯和使用變量,我仍然無法重現此行爲。 http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=dc307e31eeccd89adb3b521a4db57e69 – GarethD

+0

你說得對。嘗試你的例子後,我發現我的表有一些問題(與這個主題無關)。我修復了他們,現在我得到了結果。謝謝。 – kbaccouche

回答

3

您可以使用PATINDEX()可能喜歡

SELECT * FROM My_Table 
WHERE PATINDEX('%[^0-9][^a-z][^A-Z]%',Col1) > 0 
+0

缺乏解釋使得很難理解錯誤的位置(主要是因爲我無法確定這個查詢試圖達到什麼目的),但是當文本包含特殊字符時,它會返回一個0的patindex。 'SELECT PATINDEX('%[^ 0-9] [^ az] [^ AZ]%',NCHAR(11)+'Test')',並且當文本不包含特殊的時候會返回一個大於0的patindex字符,例如'SELECT PATINDEX('%[^ 0-9] [^ a-z] [^ A-Z]%','A4')'。所以我認爲這個邏輯是有缺陷的。 – GarethD

0

如果有興趣的UDF,下面的函數會從一個字符串剝離控制字符以及concatinate話。

例子:

Select [dbo].[udf-Str-Strip-Control]('Michael  '+char(13)+char(10)+'LastName') 

返回

Michael LastName -- << No CRLF or extra spaces and 

的,如果有興趣

CREATE FUNCTION [dbo].[udf-Str-Strip-Control](@S varchar(max)) 
Returns varchar(max) 
Begin 
    ;with cte1(N) As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)), 
      cte2(C) As (Select Top (32) Char(Row_Number() over (Order By (Select NULL))-1) From cte1 a,cte1 b) 
    Select @S = Replace(@S,C,' ') 
    From cte2 

    Return LTrim(RTrim(Replace(Replace(Replace(@S,' ','><'),'<>',''),'><',' '))) 
End