2016-05-26 7 views
0

SQL Serverの一部のレコードを更新する必要があります。実際には、文字列の一部を削除して同じレコードを更新する必要があります。私は、次のことをやった:Transact-SQL:文字列の一部を更新する方法

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つしかない場合、他のレコードはすべてこのレコードと同じ値で更新されます。

誰かが私を助けることができますか?私は間違って何をしていますか?

答えて

2

これは、カーソルを使用せずに、単一のステートメントで行うことができます

UPDATE ProductVariant 
SET Description = REPLACE(Description, 'This Should be Removed', '') 

REPLACE機能は、「これは削除する必要があります」を探し、見つかった場合は空白の文字列で置き換えます。説明に「This should be removedoved」が含まれていない場合、説明は変更されません。

UPDATE ProductVariant 
SET Description = @MER 

あなたは、単一のステートメントでそれを行うにはWHERE Id = @CONTADORを追加する必要がありますが、そのはるかに良いでしょう:あなたの更新ステートメントは、where句を持っていないため

あなたの現在のコードは、すべてのレコードを更新しています。現在のコードは、実際にはwhileループのすべての反復でテーブル全体を更新し、whileループの現在のIdの説明にテーブル全体の記述カラムを設定しています。

データベースのプログラミング時に最初に、おそらく最も重要な点は、各行を個別に処理するのではなく、一連の行全体を処理することです。

関連する問題