在SQL Server中使用SUBSTRING修剪前6个字符时的问题



我有一个名为Articles的表,令人惊讶的是,其中有一个名为Article的列,这是主键。在这个专栏中,所有的文章过去都用一个不必要的前缀来命名,我的任务是删除这个前缀。

例子:

1 - 184 - w21tk00032

1 - 154 - mxa0074

在这些例子中,184和154都指定了分销商,它们在这个表中都有几千篇文章。

我在运行这个查询时没有遇到任何问题:

UPDATE Articles
SET Article = SUBSTRING(Article,7,LEN(Article)-6)
WHERE SUBSTRING(Article,3,3) = '184'

如果没有WHERE指定,我无法运行此查询。我修改了最后一行,以切换到下一个分销商:154

WHERE SUBSTRING(Article,3,3) = '154'

并运行到这个错误:

Msg 536, Level 16, State 5, Line 1
Invalid length parameter passed to the SUBSTRING function.

我还尝试在WHERE行中使用LIKE,使用'-154-'来指定所有内容,就像这样

WHERE Article LIKE '_-154-%'

,但这将莫名其妙地导致这个,就像运行查询没有一个WHERE,因为我开始尝试:

Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'aaaaaArticles_PK'. Cannot insert duplicate key in object 'dbo.Articles'.

有什么想法或建议吗?我很茫然。现在不使用WHERE行来运行它是不可能的,因为使用184的数千种产品已经被成功地改变了。

出现问题是因为LEN(Article)至少有一行小于6,这意味着您正在将负值传递给SUBSTRING。使用WHERE LEN(Article) > 6

将它们过滤掉

这可能不是你改变的地方,这是问题。

可能有其他SUBSTRING失败的"154"行。
也就是说,可能有(Len(Article) - 6) <0.

搜索确认,然后添加CASE或类似的来管理它。

尝试:

RIGHT(article,LEN(article)-6)

代替Substring,这将选择前6个字符右边的所有内容。

最新更新