我需要更新SQL Server中的一些记录。实际上我需要删除部分字符串并更新相同的记录。我做了以下事情:
USE [BRAZIL]
DECLARE @PRODUCTDESCRIPTION nvarchar(max);
DECLARE @MERDA nvarchar(max);
DECLARE @CONTADOR Int;
DECLARE C CURSOR READ_ONLY FOR
SELECT DISTINCT Id
FROM ProductVariant
OPEN C
FETCH NEXT FROM C INTO @CONTADOR
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @PRODUCTDESCRIPTION = (SELECT Description
FROM ProductVariant
WHERE ID = @CONTADOR );
IF CHARINDEX('This Should be Removed', @PRODUCTDESCRIPTION) > 0
BEGIN
SET @MER = (SELECT SUBSTRING(@PRODUCTDESCRIPTION, 0, CHARINDEX('This Should be Removed', @PRODUCTDESCRIPTION)));
UPDATE ProductVariant
SET Description = @MER
END
SET @PRODUCTDESCRIPTION = '';
FETCH NEXT FROM C INTO @CONTADOR
END
CLOSE C
DEALLOCATE C
如果没有满足模式'This Should be Removed'
的记录,则表格中没有任何内容。这很棒。但是,如果只有一条记录有'This Should be Removed'
,则所有其他记录都会使用相同的值更新。
任何人都可以帮助我吗?我做错了什么?
答案 0 :(得分:2)
这可以在一个语句中完成,而不使用游标:
UPDATE ProductVariant
SET Description = REPLACE(Description, 'This Should be Removed', '')
REPLACE
功能查找'这应该删除',如果找到,则将其替换为空字符串。如果说明不包含“应该删除”,则说明不会更改。
您当前的代码正在更新每条记录,因为您的update语句没有where子句:
UPDATE ProductVariant
SET Description = @MER
您需要添加WHERE Id = @CONTADOR
,但在单个语句中更好。您当前的代码实际上是在while循环的每次迭代中更新整个表,并将整个表的description列设置为while循环中当前Id的描述。
在为数据库编程时要理解的第一个也许是最重要的事情是,您希望处理整个行集,而不是单独处理每一行。