Paul White의 답변에 대한 "일반적으로 아니오"라는 진술에 따르면, 다음은 질문에 대한 직접적인 답변을 제공하지만 그러한 프로세스의 체계적 한계를 보여주고 쉽게 관리하고 노출시키지 않는 방법에서 멀어지게합니다. 위험.
수 DDL 당신이 DML을하고 있습니다 같은 시간을 변경하고 싶지 않아 여러 번 언급된다. 좋은 프로그래밍은 이러한 기능을 분리하여 지원 가능성을 유지하고 스파게티 스트링 변경을 피합니다.
Paul이 간결하게 지적했듯이 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
[결론]
예, @AndriyM 과 같은 특정 버전 또는 SQL Server 패치에 대해 동일한 배치에서 DDL 및 DML을 수행 할 수 있습니다 .SQL 2017의 dbfiddle은 지적했지만 모든 DML이 지원되는 것은 아니며 이것이 항상 그런 것은 아닙니다. 제대로 작동하면 SQL Server 버전에 수차가 생겨 패치 나 새 버전으로 마이그레이션 할 때 심각한 문제가 발생할 수 있습니다.
- 또한 일반적으로 디자인은 변경을 예상해야합니다. 열 수정 / 추가에 대한 우려가 테이블에있을 수 있다는 것을 이해하지만이 문제를 일괄 적으로 적절하게 디자인 할 수 있습니다.
[추가 신용]
EXISTS 문에 관해서는 Paul이 언급했듯이 코드의 다음 단계로 넘어 가기 전에 코드를 확인하는 다른 방법이 많이 있습니다.
- EXISTS 문을 사용하면 모든 버전의 SQL Server에서 작동하는 코드를 만들 수 있습니다.
- 하나의 명령문에서 복잡한 검사를 허용하는 부울 함수