A la declaración "generalmente no" sobre la respuesta de Paul White, espero que lo siguiente ofrezca una respuesta directa a la pregunta, pero también sirva para mostrar las limitaciones sistémicas de dicho proceso y lo aleje de los métodos que no se prestan a una administración y exposición fáciles riesgos
Se puede mencionar muchas veces que no debe realizar cambios DDL al mismo tiempo que realiza DML. Una buena programación separa estas funciones para mantener la capacidad de soporte y evitar cambios en la cadena de espaguetis.
Y como Paul señaló sucintamente, SQL Server funciona en lotes .
Ahora, para aquellos que dudan de que esto funcione, probablemente no funcione en su instancia, ¡pero algunas versiones como 2017 realmente pueden funcionar! Aquí está la prueba:
[CÓDIGO DE PRUEBA - PUEDE no funcionar en muchas versiones 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
[CONCLUSIÓN]
Entonces, sí, puede realizar DDL y DML en el mismo lote para ciertas versiones o parches de SQL Server que @AndriyM, señala dbfiddle en SQL 2017 , pero no todos los DML son compatibles y no hay garantía de que siempre sea así. Si funciona, puede ser una aberración de su versión de SQL Server y esto podría causar problemas dramáticos al parchear o migrar a nuevas versiones.
- Además, en general, su diseño debe anticipar cambios. Entiendo que las preocupaciones de modificar / agregar columnas pueden tener en una tabla, pero puede diseñar adecuadamente alrededor de esto en lotes.
[CRÉDITO ADICIONAL]
En cuanto a la declaración EXISTS, como dijo Paul, hay muchos otros medios para validar el código antes de pasar al siguiente paso en su código.
- La declaración EXISTS puede ayudarlo a crear código que funcione en todas las versiones de SQL Server
- Es una función booleana que permite verificaciones complejas en una declaración