CONTAINS对char不满意(13)

时间:2014-10-01 16:23:54

标签: sql sql-server

为什么SSMS不会为我处理此脚本?

DECLARE @containsReturn AS CHAR(500) = 
'ME@ME.co.uk; 

YOU@YOU.co.uk;'


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))

我收到此错误,主要关注CHAR(13)的{​​{1}}条款中的最终UPDATE

  

Msg 102,Level 15,State 1,Line 14
  'CHAR'附近的语法不正确。

4 个答案:

答案 0 :(得分: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   不能在表格或索引视图上使用CONTAINS或FREETEXT谓词'#x'因为它不是全文索引。

如果您的真实表不是临时表,并且真的是全文索引,那么您可以。否则你可以做一些更简单的事情:

UPDATE  #x 
SET     ProblemColumn = REPLACE(ProblemColumn, char(13), '')
WHERE   ProblemColumn LIKE '%' + CHAR(13) + '%'

答案 1 :(得分: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)?

答案 2 :(得分:2)

为什么你甚至在这种情况下关注where子句,只需像这样运行更新语句

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

它会做正确的事情。它也会表现得更好

答案 3 :(得分:1)

您可以使用以下方法:

DECLARE @A VARCHAR(10) = CHAR(13)
UPDATE  #x 
SET     ProblemColumn = REPLACE(ProblemColumn, @A, '')
WHERE   ProblemColumn LIKE '%@A%'