使用 CHARINDEX 的 UPDATE 语句产生错误并且不更新任何内容

UPDATE statment with CHARINDEX is producing an error and not updating anything

我正在尝试替换一个总是出现在数据字符串末尾的长字符串。

最后这串数据总是以:<img src="null"

开头

我想什么都不替换...只是一个空白 space 这样其他数据仍然有用。

所以我尝试了 运行更新脚本,但我一直收到这个错误:

Invalid length parameter passed to the LEFT or SUBSTRING function.

这是我的 SQL 更新声明:

DECLARE @searchFor NVARCHAR(40) = N'%<img src="null"%';

UPDATE studentList
SET majorDescription = (SELECT LEFT(majorDescription , CHARINDEX(@searchFor, majorDescription ) - 1) FROM studentList)
WHERE majorDescription like N'%<img src="null"%'

我不确定为什么会出现该错误。我知道有 300 多行,因为当我 运行 这个 SELECT 语句时我可以看到它们:

SELECT majorDescription FROM studentList WHERE majorDescription like N'%<img src="null"%'

还有什么我可以尝试的吗?

谢谢!

如果找不到字符串,您还可以添加“故障保护”。

请注意,我在 charindex() 中添加了串联的 majorDescription+@searchFor

也不清楚为什么 SETSELECT

例子

DECLARE @searchFor NVARCHAR(40) = N'<img src="null"';

UPDATE studentList
SET majorDescription =  LEFT(majorDescription , CHARINDEX(@searchFor, majorDescription+@searchFor ) - 1) 
WHERE majorDescription like N'%'+@searchFor+'%'

为清楚起见,一个简单的解决方法是使用 nullif 传递 null 作为长度参数。

如果参数作为 null 传递,SQL 服务器中的许多函数将 return null 通过设计,这对于避免其他更繁琐的解决方法很有用,因此您可以尝试

SELECT LEFT(majorDescription, NullIf( CHARINDEX(@searchFor, majorDescription ) - 1, -1)) FROM studentList