Para a afirmação "geralmente não" da resposta de Paul White, espero que a seguir ofereça uma resposta direta à pergunta, mas também sirva para mostrar as limitações sistêmicas desse processo e afastá-lo de métodos que não permitem fácil gerenciamento e exposição riscos.
Ele pode ser mencionado muitas vezes não fazer DDL muda ao mesmo tempo que você está fazendo DML. Uma boa programação separa essas funções para manter a capacidade de suporte e evitar alterações nas cadeias de espaguete.
E, como Paul apontou sucintamente, o SQL Server trabalha em lotes .
Agora, para quem duvida que isso funcione, provavelmente não funciona em sua instância, mas algumas versões como 2017 podem realmente funcionar! Aqui está a prova:
[CÓDIGO DE TESTE - PODE não funcionar em muitas versões do 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
[CONCLUSÃO]
Portanto, sim, você pode executar DDL e DML no mesmo lote para determinadas versões ou patches do SQL Server, como aponta @AndriyM - dbfiddle no SQL 2017 , mas nem todo DML é suportado e não há garantia de que sempre será esse o caso. Se funcionar, isso pode ser uma aberração da sua versão do SQL Server e isso pode causar problemas dramáticos ao corrigir ou migrar para novas versões.
- Além disso, em geral, seu design deve antecipar alterações. Entendo que as preocupações de modificar / adicionar colunas podem ter em uma tabela, mas você pode projetar adequadamente isso em lotes.
[CRÉDITO EXTRA]
Quanto à instrução EXISTS, como Paul afirmou, existem muitos outros meios para validar o código antes de passar para a próxima etapa do seu código.
- A instrução EXISTS pode ajudá-lo a criar código que funciona em todas as versões do SQL Server
- É uma função booleana que permite verificações complexas em uma instrução