2

我有一个项目需要我在 SQL Server 2005 中进行开发,但要部署到 SQL Server 2000 机器上。

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

现在,我正要开始将所有存储过程 (SP) 添加到源代码控制中,并且我喜欢在每次执行查询时进行拖放添加的想法。IE 如果 SP 已经存在,先删除它。然后创建/重新创建 SP。

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

请协助编写有效的 SQL 脚本。

4

8 回答 8

4

这适用于 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
于 2010-08-09T08:16:57.493 回答
3

不要使用系统表:使用 OBJECT_ID

我也会使用 ALTER 进行部署,但使用 CREATE 维护源代码控制。也就是说,我只使用差异部署脚本(使用 ALTER),但在发布后与我的源代码控制文件夹进行比较(作为 CREATE)

我既有代码历史记录,也有更简单的部署:无需删除/创建所有 procs。例如,如果您忘记了权限怎么办?

我使用红门/SVN BTW

于 2010-08-02T14:18:31.477 回答
2

认为

 IF OBJECT_ID('your_sp_name') IS NOT NULL

会告诉你它是否在那里,虽然我不能在 2000 上测试...

于 2010-07-30T08:10:00.577 回答
1

在我看来,您sys.sp_refreshsqlmodule在我的旧答案中描述了类似 if 的所有存储过程,我正在寻找一种可靠的方法来验证 T-SQL 存储过程。有人有吗?. STORED PROCEDURE 的代码将再一次验证包含关闭依赖项。

于 2010-08-02T11:12:31.177 回答
1

FWIW

select * from sysobjects where type = 'p'

在 SQL 2008 中仍然有效,所以我猜测这仍然可以作为最低公分母接受。DMV 在 2000 年不可用。

于 2010-07-30T08:07:41.093 回答
1

你最好的选择是保持兼容性视图sysobects,,,syscolumns

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

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

于 2010-07-30T08:11:14.690 回答
0

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

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

要确定正在运行的 SQL Server 2000/2005 版本,请使用查询分析器连接到 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/


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

于 2010-08-05T16:11:33.960 回答
0

使用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
于 2010-08-04T05:12:27.347 回答