2

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

我在 2000 年创建了 SP 并希望在更高版本上运行它,反之亦然假设我在 2008 年创建了 SP(我的意思是在更高版本上创建的 SP)并想在 2000 或 2005 等较低版本上运行它需要这样做才能在不同的不同版本上使用 SP 或 SP 中的相同代码?任何人都可以帮我解决这个问题....

4

2 回答 2

2

我假设“在 2008 年创建 SP 并希望在较低版本上运行它”是指在 2008 年处理该过程的代码并在 2000 年重新创建它。

如果是这样,它将取决于您的过程中的 T-SQL 代码。如果您在 2008 上有一个 proc 可以完成 2000 所做的所有事情,那么它将适用于两个版本。但是,例如,如果您在 2008 上有一个运行 CTE 的程序,它在 2000 上将无法运行,因为该版本不支持 CTE。

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

于 2012-04-26T13:06:27.627 回答
1

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

SQL 2005+ 对分号有点迂腐/兼容,所以如果你写在那里,它应该在 SQL 2000 上运行。

有关一些列表,另请参阅sql server 2005 的新 t-sql 功能是什么?

来自经验的警告:Microsoft 承认在 SQL 2005 及更高版本中更改查询语义以提高性能。请参阅 Microsoft 2008 年 6 月 17 日上午 11:34 的回复: 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(as smalldatetime) 之后优化“Where IsDate”。这意味着它试图投射不是日期的东西,并返回错误。我相信我尝试进一步嵌套子查询,以便 Cast 位于带有 IsDate 的查询之外,但它仍然失败。解决方案是使用子查询的结果构建一个临时表或表变量,并将其连接到我们的稀疏表。

于 2012-04-26T13:22:55.140 回答