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

时间:2016-05-26 00:36:57

标签: 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

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',则所有其他记录都会使用相同的值更新。

任何人都可以帮助我吗?我做错了什么?

1 个答案:

答案 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的描述。

在为数据库编程时要理解的第一个也许是最重要的事情是,您希望处理整个行集,而不是单独处理每一行。