На твердження "взагалі ні" на відповідь Пола Уайта, я сподіваюсь, що надає пряму відповідь на питання, але також слугує для відображення системних обмежень такого процесу і відхиляє вас від методів, які не піддаються простому управлінню та не піддаються впливу ризики.
Це може бути згадано багато разів , щоб не зробити DDL зміни в той же час ви робите DML. Хороше програмування розділяє ці функції, щоб підтримувати підтримку та уникати змін в рядах спагетті.
І як Лаконічно зазначив Пол, SQL Server працює партіями .
Тепер, для тих, хто сумнівається в цьому, це, мабуть, не у вашому випадку, але в деяких версіях, таких як 2017, він може працювати! Ось доказ:
[ТЕСТОВИЙ КОД - МОЖЕ не працювати на багатьох версіях 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
[ВИСНОВОК]
Так що так, ви можете виконувати DDL і DML в одній партії для певних версій або патчів SQL Server, як вказує @AndriyM - dbfiddle на SQL 2017 , але не всі DML підтримуються, і немає гарантій, що це завжди буде так. Якщо це працює, це може бути відхиленням вашої версії SQL Server, і це може спричинити кардинальні проблеми під час виправлення або переходу на нові версії.
- Крім того, загалом ваш дизайн повинен передбачити зміни. Я розумію, що проблеми щодо зміни / додавання стовпців можуть бути на столі, але ви можете правильно розробити це навколо пакетів.
[ДОПОМОГА КРЕДИТ]
Що стосується оператора EXISTS, то, як заявив Павло, існує багато інших засобів для перевірки коду, перш ніж перейти до наступного кроку вашого коду.
- Оператор EXISTS може допомогти вам створити код, який працює на всіх версіях SQL Server
- Це булева функція, яка дозволяє здійснювати складні перевірки в одному операторі