我有一个名为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个字符右边的所有内容。