2016-05-26 10 views
0

Ich muss einige Datensätze in SQL Server aktualisieren. Tatsächlich muss ich einen Teil eines Strings entfernen und den gleichen Datensatz aktualisieren. Ich habe folgendes getan:Transact-SQL: wie Teil der Zeichenfolge zu aktualisieren

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   

Wenn kein Datensatz ist, der das Muster 'This Should be Removed' passiert nichts auf dem Tisch erfüllt. Das ist toll. Aber wenn es nur einen Datensatz gibt, der 'This Should be Removed' hat, werden alle anderen Datensätze mit demselben Wert aktualisiert.

Kann mir jemand helfen? Was mache ich falsch?

Antwort

2

Dies kann in einer einzigen Anweisung erfolgen, ohne einen Cursor zu verwenden:

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

Die REPLACE Funktion sucht, ‚sollten diese entfernt werden‘, und wenn ersetzen sie gefunden mit einem leeren String. Wenn eine Beschreibung nicht enthält "Dies sollte entfernt werden", wird die Beschreibung nicht geändert.

Ihr aktueller Code aktualisiert jeden Datensatz, weil Ihre Update-Anweisung nicht über eine where-Klausel:

UPDATE ProductVariant 
SET Description = @MER 

Sie benötigen würden WHERE Id = @CONTADOR hinzufügen, aber sein viel besser es in einer einzigen Anweisung zu tun. Ihr aktueller Code aktualisiert tatsächlich die gesamte Tabelle bei jeder Iteration der while-Schleife und setzt die Beschreibungsspalte für die gesamte Tabelle auf die Beschreibung der aktuellen ID in der while-Schleife.

Die erste und wahrscheinlich wichtigste Sache zu verstehen, wenn Sie für Datenbanken programmieren, ist, dass Sie an der gesamten Reihe von Zeilen arbeiten möchten, anstatt jede Zeile einzeln zu verarbeiten.