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

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

问题描述:

我有一个项目需要我在SQL Server 2005中进行开发,但部署到SQL Server 2000框。如何以SQL 2000 + SQL 2005兼容方式删除存储过程?

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

现在我正要开始将所有存储过程(SP)添加到源代码管理,并且我喜欢每次执行查询时执行drop-add的想法。 I.E.如果SP已经存在,先放下它。然后创建/重新创建SP。

如何在单个脚本中以与SQL 2000和SQL 2005兼容的方式执行此操作,以便在开发(2000)和生产(2005)期间我的脚本可以正常工作?我相信语法略有不同,并且SP元数据存储在不同的系统表中。

请协助工作的SQL脚本。

+0

开始时你会说“开发2005年,部署到2000年”,但最后你会说“开发2000年,部署到2005年”。这是什么? – 2010-08-24 23:25:19

+0

是的,你说得对。但它不应该影响我的问题的答案。 – 2010-08-30 00:19:05

这对于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 

FWIW

select * from sysobjects where type = 'p' 

仍然工作在2008年SQL,所以我猜测,这仍最小公分母可以接受的。 DMV的无法获得2000年

认为

IF OBJECT_ID('your_sp_name') IS NOT NULL 

会告诉你,如果它是存在的,虽然我不能在2000年在莫测试...

你最好的选择是staill的兼容性视图,sysobectssyscolumns

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

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

在我看来,你重新创建的所有存储过程与尊重sys.sp_refreshsqlmodule如果我老的答案I'm looking for a reliable way to verify T-SQL stored procedures. Anybody got one?描述等。 STORED PROCEDURE的代码将再次被验证,包括关闭依赖关系。

不要使用系统表:使用OBJECT_ID

我也使用ALTER部署,但使用CREATE保持源代码控制。也就是说,我只使用差异部署脚本(使用ALTER),但与发布后的源代码管理文件夹相比较(作为CREATE)

我有代码历史记录和更简单的部署:不需要删除/创建全部特效。例如,如果你忘记了许可权呢?

我使用红门/ SVN BTW

使用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 

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

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

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

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

的结果是: 产品版本(例如,8.00.534)。 产品级别(例如“RTM”或“SP2”)。 该版本(例如,“标准版”)。

例如,结果看起来类似: 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/


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