Auf die "allgemein nein" -Statement zu Paul Whites Antwort bietet das Folgende hoffentlich eine direkte Antwort auf die Frage, dient aber auch dazu, die systemischen Einschränkungen eines solchen Prozesses aufzuzeigen und Sie von Methoden fernzuhalten, die sich nicht für eine einfache Verwaltung und Aufdeckung eignen Risiken.
Es kann oft erwähnt werden, dass DDL-Änderungen nicht gleichzeitig mit DML vorgenommen werden. Eine gute Programmierung trennt diese Funktionen, um die Unterstützbarkeit aufrechtzuerhalten und Änderungen der Spaghetti-Saiten zu vermeiden.
Und wie Paul kurz und bündig hervorhob, arbeitet SQL Server in Stapeln .
Nun, für diejenigen, die bezweifeln, dass dies funktioniert, funktioniert es wahrscheinlich nicht auf Ihrer Instanz, aber einige Versionen wie 2017 können tatsächlich funktionieren! Hier ist der Beweis:
[TESTCODE - Funktioniert möglicherweise nicht mit vielen Versionen von SQL Server]
USE master
GO
CREATE TABLE foo (a VARCHAR(11) )
GO
BEGIN TRANSACTION;
INSERT INTO dbo.foo (a)
VALUES ('entry')
/*****
[2] Check Values
*****/
SELECT a FROM dbo.foo
/*****
[3] Add Column
*****/
ALTER TABLE dbo.foo
ADD b VARCHAR(11)
/*****
[3] Insert value into this new column in the same batch
-- Again, this is just an example. Please do not do this in production
*****/
IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
AND name = 'b')
INSERT INTO dbo.foo (b)
VALUES ('d')
COMMIT TRANSACTION;
/*****
[4] SELECT outside transaction
-- this will fail
*****/
--IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
-- AND name = 'b')
-- SELECT b FROM dbo.foo
-- this will work...but a SELECT * ???
IF EXISTS (SELECT * FROM sys.columns WHERE object_ID('foo') = object_id
AND name = 'b')
SELECT * FROM dbo.foo
DROP TABLE dbo.foo
[FAZIT]
Ja, Sie können DDL und DML für bestimmte Versionen oder Patches von SQL Server im selben Stapel ausführen, wie @AndriyM - dbfiddle unter SQL 2017 hervorhebt , aber nicht alle DMLs werden unterstützt, und es gibt keine Garantie dafür, dass dies immer der Fall ist. Wenn dies funktioniert, kann dies eine Abweichung von Ihrer SQL Server-Version sein. Dies kann zu dramatischen Problemen führen, wenn Sie patchen oder auf neue Versionen migrieren.
- Außerdem sollte Ihr Design im Allgemeinen Änderungen vorwegnehmen. Ich verstehe die Bedenken, die das Ändern / Hinzufügen von Spalten in einer Tabelle haben kann, aber Sie können dies in Stapeln richtig gestalten.
[ZUSÄTZLICHES KREDIT]
Wie Paul bereits sagte, gibt es für die EXISTS-Anweisung viele andere Möglichkeiten, den Code zu validieren, bevor Sie mit dem nächsten Schritt in Ihrem Code fortfahren.
- Mit der EXISTS-Anweisung können Sie Code erstellen, der auf allen Versionen von SQL Server funktioniert
- Es ist eine boolesche Funktion, die komplexe Überprüfungen in einer Anweisung ermöglicht
b
in der insert-Anweisung kompiliert wird . Ich verwende SQL Server 2014