为什么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'附近的语法不正确。
答案 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%'