Các phương pháp hay nhất để đảm bảo rằng SQL của bạn có thể chạy nhiều lần mà không nhận được lỗi trên các lần chạy tiếp theo là gì?Các kịch bản SQL Server có thể chạy lại
ví dụ:
- kiểm tra rằng các bảng không đã tồn tại trước khi tạo chúng
- kiểm tra xem cột không đã tồn tại trước khi tạo hoặc đổi tên
- giao dịch với rollback về lỗi
- Nếu bạn thả bảng mà tồn tại trước tạo ra chúng một lần nữa, thả phụ thuộc của họ trước, và đừng quên tạo lại chúng sau
- Sử dụng CREATE OR ALTER PROCEDURE thay vì CREATE PROCEDURE hoặc ALTER PROCEDURE nếu hương vị của SQL của bạn hỗ trợ nó
- Duy trì một lược đồ phiên bản nội bộ, vì vậy cùng một SQL không chạy hai lần ngay từ đầu. Bằng cách này, bạn luôn biết mình đang ở đâu bằng cách xem số phiên bản.
Xuất dữ liệu hiện có sang câu lệnh INSERT và hoàn toàn tạo lại toàn bộ DB từ đầu.
thả bảng trước khi tạo chúng (không phải là điều an toàn nhất bao giờ hết, nhưng sẽ làm việc trong một pinch nếu bạn biết những gì bạn đang làm)
chỉnh sửa: tôi đang tìm kiếm một cái gì đó như thế này:
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[foo]')
AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1)
DROP TABLE foo
Người khác có sử dụng câu như thế này hay cái gì tốt hơn không?
chỉnh sửa: Tôi thích gợi ý Jhonny của:
IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name
tôi làm điều này cho cột thêm:
IF NOT EXISTS (SELECT *
FROM SYSCOLUMNS sc
WHERE EXISTS (SELECT id
FROM [dbo].[sysobjects]
WHERE NAME LIKE 'TableName'
AND sc.id = id)
AND sc.name = 'ColumnName')
ALTER TABLE [dbo].[TableName] ADD [ColumnName]
tôi muốn loại bỏ rơi bảng trước khi tạo ra chúng. Bạn sẽ không muốn thả bảng với dữ liệu! –
Đồng ý, nó có lẽ không phải là điều an toàn nhất để làm. Tôi chỉ cố gắng để có được quả bóng lăn trên các loại phản ứng tôi đang tìm kiếm. –