代码之家  ›  专栏  ›  技术社区  ›  Saajid Ismail

如何以与SQL 2000+SQL 2005兼容的方式删除存储过程?

  •  2
  • Saajid Ismail  · 技术社区  · 15 年前

    我有一个项目要求我在SQL Server 2005中进行开发,但要在SQL Server 2000框中进行部署。

    对于99%的SQL代码,我没有问题,所有的代码似乎都是向后兼容的。

    现在,我正准备将所有存储过程(SP)添加到源代码管理中,我喜欢在每次执行查询时执行一次删除添加。也就是说,如果SP已经存在,请先删除它。然后创建/重新创建SP。

    我如何在一个脚本中这样做,以一种既兼容SQL 2000又兼容SQL 2005的方式,以便我的脚本只在开发(2000)和生产(2005)期间工作?我认为语法稍有不同,sp元数据存储在不同的系统表中。

    请协助使用SQL脚本。

    8 回复  |  直到 11 年前
        1
  •  4
  •   devmake    15 年前

    这适用于SQL 2000和SQL 2005。我现在已经测试过了。

    USE databasename
    GO
    
    IF object_id('schema.StoredProcedureName') IS NOT NULL
    DROP PROCEDURE schema.StoredProcedureName
    GO
    
    CREATE PROCEDURE schema.StoredProcedureName
    .. your code
    
        2
  •  3
  •   gbn    15 年前

    不使用系统表:使用对象ID

    我还将使用alter部署,但使用create维护源代码管理。也就是说,我只使用差分部署脚本(使用alter),但在发布后将其与源代码管理文件夹(作为create)进行比较。

    我有代码历史和更简单的部署:不需要删除/创建所有进程。例如,如果您忘记了一个权限怎么办?

    我使用红色门/svn btw

        3
  •  2
  •   cjk    15 年前

    认为

     IF OBJECT_ID('your_sp_name') IS NOT NULL
    

    我会告诉你它是否在那里,尽管我不能在2000年的月考…

        4
  •  1
  •   StuartLC    15 年前

    FWW

    select * from sysobjects where type = 'p'
    

    仍然适用于SQL 2008,所以我猜想这仍然是可以接受的最低公分母。2000年没有DMV。

        5
  •  1
  •   Mutation Person    15 年前

    最好的选择是稳定兼容性视图, sysobects , syscolumns

    查看以下链接 http://msdn.microsoft.com/en-us/library/ms187376.aspx

    早期的许多系统表 SQL Server的版本现在 实现为一组视图。这些 视图称为兼容性 视图,它们是向后的 仅兼容性。兼容性 视图公开的元数据与 在SQL Server 2000中可用。

        6
  •  1
  •   Community CDub    8 年前

    在我看来,您重新创建了 sys.sp_refreshsqlmodule 就像我以前的回答中描述的那样 I'm looking for a reliable way to verify T-SQL stored procedures. Anybody got one? . 存储过程的代码将再次经过验证,包括非依赖项。

        7
  •  0
  •   8kb    15 年前

    使用 INFORMATION_SCHEMA.ROUTINES 视图应该在SQL Server 2000、2005和2008中工作。唯一的缺点是视图不再是确定对象模式的可行方法。

    但如果这不是一个问题,请尝试这样的脚本:

    USE YourDB
    GO
    
    IF EXISTS (
      SELECT * 
      FROM INFORMATION_SCHEMA.ROUTINES 
      WHERE ROUTINE_NAME = 'usp_test'
    ) DROP PROCEDURE usp_test
    GO
    
    CREATE PROCEDURE usp_test AS
    SELECT 1 AS val
    GO
    
    EXEC usp_test
    GO
    
        8
  •  0
  •   dave    15 年前

    在大多数情况下,我会尝试在2005框上运行sql2000 tsql,因为我希望它在很大程度上向后兼容。也就是说,您应该完成生产箱的升级,以便使用更新的TSQL。

    如果找不到版本之间的兼容性,可以先检测版本。

    要确定运行的是哪个版本的SQL Server 2000/2005,请使用查询分析器连接到SQL Server 2000/2005,然后运行以下代码:

       SELECT 
          SERVERPROPERTY('productversion'), 
          SERVERPROPERTY ('productlevel'), 
          SERVERPROPERTY ('edition')
    

    结果是: 产品版本(例如8.00.534)。 产品级别(例如,__rtm_157;或__sp2_3)。 版本(例如,标准版)。

    例如,结果类似于: 8.00.534 RTM标准版


    来源: http://blog.sqlauthority.com/2007/03/07/sql-server-script-to-determine-which-version-of-sql-server-2000-2005-is-running/


    一旦确定了版本,就可以执行适当级别的代码。