Đối với tuyên bố "nói chung là không" về câu trả lời của Paul White, tôi hy vọng sẽ đưa ra câu trả lời trực tiếp cho câu hỏi nhưng cũng cho thấy những hạn chế mang tính hệ thống của quy trình đó và giúp bạn tránh xa các phương pháp không cho vay dễ dàng quản lý và phơi bày rủi ro.
Có thể đề cập nhiều lần để không làm thay đổi DDL giống như khi bạn tạo DML. Lập trình tốt tách các chức năng này để duy trì khả năng hỗ trợ và tránh thay đổi chuỗi spaghetti.
Và như Paul đã chỉ ra một cách ngắn gọn, SQL Server hoạt động theo từng đợt .
Bây giờ, đối với những người nghi ngờ điều này hoạt động, có thể nó không có trong trường hợp của bạn nhưng một số phiên bản như 2017 nó thực sự có thể hoạt động! Đây là bằng chứng:
[MÃ TEST - CÓ THỂ không hoạt động trên nhiều phiên bản 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
[PHẦN KẾT LUẬN]
Vì vậy, có, bạn có thể thực hiện DDL và DML trong cùng một đợt cho các phiên bản hoặc bản vá nhất định của SQL Server như @AndriyM - dbfiddle trên SQL 2017 chỉ ra, nhưng không phải tất cả DML đều được hỗ trợ và không có gì đảm bảo điều này sẽ luôn như vậy. Nếu nó hoạt động, đó có thể là một quang sai của phiên bản SQL Server của bạn và điều này có thể gây ra sự cố nghiêm trọng khi bạn vá hoặc di chuyển sang các phiên bản mới.
- Thêm vào đó, nói chung thiết kế của bạn nên lường trước những thay đổi. Tôi hiểu các mối quan tâm của việc sửa đổi / thêm các cột có thể có trên một bảng, nhưng bạn có thể thiết kế chính xác xung quanh điều này theo từng đợt.
[TÍN DỤNG THÊM]
Đối với tuyên bố EXISTS, như Paul đã nêu, có rất nhiều phương tiện khác để xác thực mã trước khi chuyển sang bước tiếp theo trong mã của bạn.
- Câu lệnh EXISTS có thể giúp bạn tạo mã hoạt động trên tất cả các phiên bản của SQL Server
- Đây là một hàm Boolean cho phép kiểm tra phức tạp trong một câu lệnh