可重新运行的SQL Server脚本

Jas*_*ell 12 sql t-sql sql-server

确保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
Run Code Online (Sandbox Code Playgroud)

其他人是否使用这样或更好的陈述?

编辑:我喜欢Jhonny的建议:

IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name
Run Code Online (Sandbox Code Playgroud)

我这样做是为了添加列:

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] 
Run Code Online (Sandbox Code Playgroud)

cms*_*sjr 5

我认为确保脚本可重新运行的最重要的做法是...... 在对脚本进行任何更改后,多次对测试数据库运行它们.您遇到的错误应该会影响您的实践.

编辑

为了响应您对语法的编辑,我认为最好避免系统表支持系统视图,例如

if exists(Select 1 from information_schema.tables where table_name = 'sometable')
    drop sometable
go
if exists(Select 1 from information_schema.routines where 
specific_name  = 'someproc')
   drop someproc 
Run Code Online (Sandbox Code Playgroud)


Ryu*_*Ryu 5

为了简化操作,我将Management Studio配置为将对象脚本化为可重新运行

  1. 工具类
  2. 选件
  3. SQL Server对象资源管理器
  4. 脚本编写
  5. 对象脚本选项
  6. 包括如果不存在则为


Tod*_*d R 0

要维护架构,请查看迁移工具。我认为 LiquiBase 适用于 SQL Server。