À la déclaration «généralement non» sur la réponse de Paul White, ce qui suit, j'espère, offre une réponse directe à la question, mais sert également à montrer les limites systémiques d'un tel processus et vous éloigne des méthodes qui ne se prêtent pas à une gestion facile et exposent des risques.
Il peut être mentionné plusieurs fois de ne pas effectuer de modifications DDL en même temps que vous effectuez DML. Une bonne programmation sépare ces fonctions pour maintenir la prise en charge et éviter les changements de chaîne de spaghetti.
Et comme Paul l'a souligné succinctement, SQL Server fonctionne par lots .
Maintenant, pour ceux qui doutent que cela fonctionne, cela ne fonctionne probablement pas sur votre instance, mais certaines versions comme 2017, cela peut réellement fonctionner! En voici la preuve:
[CODE DE TEST - PEUT ne pas fonctionner sur de nombreuses versions de 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
[CONCLUSION]
Donc, oui, vous pouvez effectuer DDL et DML dans le même lot pour certaines versions ou correctifs de SQL Server comme le souligne @AndriyM - dbfiddle sur SQL 2017 , mais tous les DML ne sont pas pris en charge et il n'y a aucune garantie que ce sera toujours le cas. Si cela fonctionne, cela peut être une aberration de votre version de SQL Server et cela peut provoquer des problèmes dramatiques lorsque vous corrigez ou migrez vers de nouvelles versions.
- De plus, en général, votre conception doit anticiper les changements. Je comprends que la modification / l'ajout de colonnes puisse avoir sur une table, mais vous pouvez concevoir correctement cela par lots.
[CRÉDIT SUPPLÉMENTAIRE]
En ce qui concerne l'instruction EXISTS, comme Paul l'a déclaré, il existe de nombreux autres moyens de valider le code avant de passer à l'étape suivante de votre code.
- L'instruction EXISTS peut vous aider à créer du code qui fonctionne sur toutes les versions de SQL Server
- Il s'agit d'une fonction booléenne qui permet des vérifications complexes dans une seule instruction