2014-10-01 36 views
2

爲什麼SSMS不會爲我處理這個腳本?CONTAINS不滿意char(13)

DECLARE @containsReturn AS CHAR(500) = 
'[email protected]; 

[email protected];' 


CREATE TABLE #x(ProblemColumn CHAR(500)); 
INSERT INTO #x VALUES(@containsReturn); 

SELECT * FROM #X; 


UPDATE #x 
SET  ProblemColumn = REPLACE(ProblemColumn, char(13), '') 
WHERE CONTAINS(ProblemColumn, CHAR(13)) 

我得到這個錯誤,UPDATEWHERE子句中集中在最後CHAR(13)

Msg 102, Level 15, State 1, Line 14
Incorrect syntax near 'CHAR'.

+0

它是'chr(13)'我想.... – 2014-10-01 16:27:29

+0

你知道包含是一個全文搜索?該列是全文索引? – Paparazzi 2014-10-01 16:30:08

+1

@ gloomy.penguin你的評論不正確。 – whytheq 2014-10-01 16:40:19

回答

2

一個快速的事,爲什麼你更在乎where子句在這種情況下,只需要運行這樣

UPDATE #x 
SET  ProblemColumn = REPLACE(ProblemColumn, char(13), '') 

它會做正確的事的更新語句。它也會表現的更好

+1

沒有,這不會表現更好。它會鎖定每一行。 – Paparazzi 2014-10-01 16:37:01

+0

@Blam我的桌子很小,很少用,所以@ mannyyysh的答案工作正常。此外,它節省了添加FT-index的開銷。 – whytheq 2014-10-01 16:38:49

+2

@whytheq - 恭喜,您選擇了最差的解決方案。 – Jamiec 2014-10-01 16:42:24

4

因爲TSQL CONTAINS方法採用NVARCHAR作爲第二個參數,它不能隱式轉換CHAR(13)所以你需要聲明它是一個變量,它可以是:

DECLARE @srch NVARCHAR(1) = CHAR(13) 
UPDATE #x 
SET  ProblemColumn = REPLACE(ProblemColumn, char(13), '') 
WHERE CONTAINS(ProblemColumn, @srch) 

順便說一句,當你做到這一點,你只會得到另一個錯誤:

Msg 7601, Level 16, State 2, Line 15 Cannot use a CONTAINS or FREETEXT predicate on table or indexed view '#x' because it is not full-text indexed.

如果你真正的表是不是一個臨時表,真的是索引,你會沒事的全文。否則,你可能只是做一些簡單得多:

UPDATE #x 
SET  ProblemColumn = REPLACE(ProblemColumn, char(13), '') 
WHERE ProblemColumn LIKE '%' + CHAR(13) + '%' 
4
UPDATE #x 
SET  ProblemColumn = REPLACE(ProblemColumn, char(13), '') 
WHERE CHARINDEX (char(13), ProblemColumn) > 0; 

其中取消了每一行的鎖定。

CHARINDEX不是全文。如果你只是爲了這個而使用全文,那麼就不要。

如果你是從字面上將像然後

INSERT INTO #x VALUES(REPLACE(@containsReturn, char(13), '')); 

值它消除了更新共

如果你正在清理出CHAR(13)爲什麼不還明確了CHAR(10)?

+0

+1感謝mannyyysh回答的效率提升 – whytheq 2014-10-01 16:39:39

+0

WHERE子句應該是WHERE CHARINDEX(char(13),ProblemColumn)> 0; – 2016-08-05 05:06:39