【问题标题】:SQL - How to: IF then GO (execute new query) in the same script without dynamic SQL?SQL - 如何:在没有动态 SQL 的情况下在同一脚本中执行 IF then GO(执行新查询)?
【发布时间】:2014-07-03 12:57:05
【问题描述】:

简而言之,我正在管理一堆版本化的 SQL 脚本,其中一个要求是它们需要向后兼容,因为相同的脚本可以多次执行,但仍保证最新版本的最终结果相同.基本上,假设我们使用的是版本 3。我们需要能够一遍又一遍地运行版本 1、2 和 3 的脚本,没有错误,并且仍然保证最终结果是相同的完整版本 3。

现在这在正常情况下很容易(只需检查列/表/类型是否正确,如果不正确则创建/修改),但是您如何处理例如长度超过 8000 个字符且不能作为动态 SQL 执行?随着版本 2 的安装,触发器被删除,最后,新的触发器被创建以匹配 v2 的数据模型。但是,如果 v3 删除了 v2 触发器引用的列之一,该触发器现在将失败。

我无法进行任何类型的 IF 检查来查看我们的日志是否有 v3 脚本,或者数据模型是否不符合要求。我讨厌让其他人做体力劳动来做一些我确信可以以一种或另一种方式自动化的事情。那么有什么好的噱头、技巧或只是我错过的东西可以提供帮助吗?

感谢您的帮助。 :)

【问题讨论】:

    标签: sql sql-server sql-server-2008 triggers dynamic-sql


    【解决方案1】:

    但是您如何处理例如超过 8000 的触发器 字符长,不能作为动态 SQL 执行?

    可以使用sp_executesql执行,其sql语句的大小仅受可用数据库服务器内存的限制。

    您需要检查对象是否存在,如果需要则创建它,否则删除。

    if object_id(N'your_table_name','U') is null
    CREATE TABLE
    ...
    GO
    /* add column */
    if not exists (select * from sys.columns
                   where object_id=object_id('TableName','U') and name='ColumnName')
    ALTER TABLE TableName
    ADD ColumnName
    GO
    /* creating Stored Procedure */
    if object_id(N'ProcedureName','P') is null
    EXEC sp_executesql N'CREATE PROCEDURE ProcedureName AS print 1'
    GO
    
    ALTER PROCEDURE ProcedureName
    
    AS
    /*your actual code here*/
    GO
    
    /* and so on */
    

    object_id 函数的对象类型你可以看到here

    【讨论】:

    • 太棒了。非常感谢!我之前尝试过使用 sp_executesql,但由于当时很忙,我错过了你似乎无法在一个内部执行多个查询,但我可以将这些分成几批 sp_executesql,所以这是完美的! :)
    • @Kahn 很高兴有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2012-10-27
    • 2014-07-30
    • 2010-09-08
    • 2021-07-17
    • 2018-12-17
    • 2013-01-06
    • 2017-01-07
    • 2015-02-07
    相关资源
    最近更新 更多