Frage

Ich habe einen SQL-Skript, das ich arbeite und ich laufe in ein Problem, wenn ich (oder Bearbeitung) eine Spalte bin zu schaffen und dann diese neuen Spalt zu ändern versuchen.

Zum Beispiel:

BEGIN
    ALTER TABLE SampleTable ADD ColumnThree int 
END

IF (EXISTS (SELECT * FROM sys.columns WHERE name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

Nun dachte ich, die BEGIN / END-Blöcke würden heraus diese beiden Elemente trennen, aber ich erhalte eine Fehlermeldung „Ungültige Spaltenname‚ColumnThree‘.“ wenn ich versuche, dies auszuführen. Warum? Sollte nicht die erste BEGIN / END eingerichtet, dass ColumnThree und mehr auf den Punkt die IF (VORHANDEN sollte die UPDATE-Anweisung schützt ausgeführt werden, wenn der Spaltenname existiert nicht.

Was ist der richtige Weg, so etwas zu tun? (Ich scheine ein paar ähnliche Szenarien zu haben, wo dies erforderlich ist).

War es hilfreich?

Lösung

Sie müssen GO , nicht BEGIN/END. Auch Sie möchten Ihre EXISTS Abfrage ein wenig bearbeiten, um sicherzustellen, dass Sie immer die richtige Tabelle:

ALTER TABLE SampleTable ADD ColumnThree int 
GO

IF (EXISTS 
        (SELECT 1 
         FROM 
             sys.columns c 
             INNER JOIN sys.tables t ON 
                 c.object_id = t.object_id 
         WHERE 
             t.name = 'SampleTable' 
             AND c.name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

Wenn Sie mehrere Schemas verwenden, werden Sie sys.schemas in die Kontrolle, als auch zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top