Sql server Transact-SQL:如何更新字符串的一部分

Sql server Transact-SQL:如何更新字符串的一部分,sql-server,cursor,substring,Sql Server,Cursor,Substring,我需要更新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

我需要更新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        
如果没有满足模式“应删除”的记录,则表上不会发生任何事情。这太棒了。但是,如果只有一条记录具有
“应删除此记录”
,则所有其他记录都将使用此记录的相同值进行更新


有人能帮我吗?我做错了什么?

这可以在一条语句中完成,无需使用光标:

UPDATE ProductVariant
SET Description = REPLACE(Description, 'This Should be Removed', '')
REPLACE
函数查找“应删除此项”,如果找到,将用空白字符串替换。如果说明不包含“应删除此项”,则说明不会更改

当前代码正在更新每条记录,因为update语句没有where子句:

UPDATE ProductVariant
SET Description = @MER
您需要添加
,其中Id=@CONTADOR
,但最好在一条语句中添加。您当前的代码实际上是在while循环的每次迭代中更新整个表,并将整个表的description列设置为while循环中当前Id的description


在为数据库编程时,首先要了解的可能也是最重要的一点是,您希望处理整组行,而不是单独处理每一行。

这可以在单个语句中完成,而无需使用光标:

UPDATE ProductVariant
SET Description = REPLACE(Description, 'This Should be Removed', '')
REPLACE
函数查找“应删除此项”,如果找到,将用空白字符串替换。如果说明不包含“应删除此项”,则说明不会更改

当前代码正在更新每条记录,因为update语句没有where子句:

UPDATE ProductVariant
SET Description = @MER
您需要添加
,其中Id=@CONTADOR
,但最好在一条语句中添加。您当前的代码实际上是在while循环的每次迭代中更新整个表,并将整个表的description列设置为while循环中当前Id的description

在为数据库编程时,需要了解的第一件也是可能最重要的一件事是,您希望处理整个行集合,而不是单独处理每一行