确保SQL可以重复运行而不会在后续运行中收到错误的最佳实践是什么?
例如
在创建表之前检查表是否已存在
在创建或重命名之前检查列是否已存在
错误时回滚的事务
如果在重新创建表之前删除存在的表,则首先删除它们的依赖项,并且不要忘记在之后重新创建它们
如果您的SQL风格支持它,请使用CREATE OR ALTER PROCEDURE而不是CREATE PROCEDURE或ALTER PROCEDURE
维护内部版本控制方案,因此相同的SQL首先不会运行两次.通过这种方式,您可以通过查看版本号来了解自己所处的位置.
将现有数据导出到INSERT语句,并从头开始完全重新创建整个DB.
在创建它们之前删除表(不是最安全的事情,但是如果你知道你在做什么的话就会工作)
编辑:我正在寻找这样的东西:
IF EXISTS ( SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[foo]')
AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1 )
DROP TABLE foo
其他人是否使用这样或更好的陈述?
编辑:我喜欢Jhonny的建议:
IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name
我这样做是为了添加列:
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]