如何处理存储过程的兼容性

时间:2012-04-26 12:45:44

标签: sql-server-2008 sql-server-2005 sql-server-2000 sql-server-2008-r2

您好我正在使用MSSQLSERVER 2000,2005,2008和2008R2

我在2000年创建了SP,并希望在更高版本上运行它,或者反过来说假设我在2008年创建了SP(我的意思是在高级版本上创建了SP)并希望在较低版本(如2000或2005)上运行它我需要做什么,以便SP或SP内的相同代码将用于不同的不同版本? 任何人都可以帮我解决这个问题....

2 个答案:

答案 0 :(得分:2)

我认为通过“在2008年创建SP并希望在较低版本上运行它”,你的意思是在2008年处理程序的代码并在2000年重新创建它。

如果是这样,它将取决于您的过程中的T-SQL代码。如果你在2008年有一个proc来完成2000所做的一切,它将适用于这两个版本。但是如果你在2008年有一个运行CTE的程序,它就不会在2000上运行,因为该版本不支持CTE。

this链接将下载显示差异的文档

答案 1 :(得分:1)

首先,不要使用CTE或表变量。

SQL 2005+对于分号更加迂腐/顺从,所以如果你在那里写,它应该在SQL 2000上运行。

有关一些列表,另请参阅What are the new t-sql features sql server 2005?

来自经验的警告:Microsoft承认在SQL 2005及更高版本中更改查询语义以提高性能。请参阅Microsoft的6/17/08 11:34 AM回复: http://connect.microsoft.com/SQLServer/feedback/details/350485/bug-with-newid-and-table-expressions

例如,我在SQL 2000中编写了一个子查询,以返回有效日期列表。

Select dates.Date, *
From (
    Select Cast(y + '-' + m + '-' + d1 + d2 As smalldatetime) [date]
    From (Select '2007' y Union Select '2008') y,
    (Select '01' m Union Select '02' Union Select '03' Union Select '04' Union Select '05'Union Select '06' Union Select '07' Union Select '08' Union Select '09' Union Select '10' Union Select '11' Union Select '12') m,
    (Select '0' d1 Union Select '1' Union Select '2' Union Select '3') d1,
    (Select '0' d2 Union Select '1' Union Select '2' Union Select '3' Union Select '4' Union Select '5' Union Select '6' Union Select '7' Union Select '8' Union Select '9') d2
    Where IsDate(y + '-' + m + '-' + d1 + d2) = 1
) dates

我使用它作为子查询加入到具有稀疏日期的表中,因此我可以构建日历。虽然不理想,但我不想在这种情况下建立一个“日期”表,并且它有效。

当我们切换到SQL Server 2005时,它决定在Cast之后优化“Where IsDate”(作为smalldatetime)。这意味着它试图投射不是日期的东西,并返回错误。我相信我尝试进一步嵌套子查询,以便Cast在IsDate的查询之外,它仍然失败。解决方案是使用子查询的结果构建临时表或表变量,并将其连接到稀疏表。