На утверждение «вообще нет» в ответе Пола Уайта следующее, я надеюсь, предлагает прямой ответ на вопрос, но также служит для демонстрации системных ограничений такого процесса и отвлекает вас от методов, которые не поддаются простому управлению и разоблачению риски.
Это может быть упомянуто много раз , чтобы не сделать 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.
- Это булева функция, которая позволяет сложные проверки в одном выражении
b
в операторе вставки. Я использую SQL Server 2014