【问题标题】:How to work on stored procedures for compatibility如何处理存储过程以实现兼容性
【发布时间】:2012-05-07 04:52:14
【问题描述】:

您好,我使用的是 MSSQLSERVER 2000,2005,2008 和 2008R2

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 同意在 2000 年没有 CTE 概念,所以我们应该如何使代码兼容或 SP 兼容假设我使用 200、2005 年的日期,但如果我们使用的日期时间不在 2000 年,这给出我们的错误。你能帮我看看我们应该怎么做吗?
    • 您好,CTE 只是一个例子,您需要担心几件事情。正如您所指出的,日期时间也不同。我认为唯一可以确定的方法是尝试在 2000 年创建 proc
    • 好的,现在我已经安装了 2000,2005 和 2008 我尝试在单行中进行多次插入,这是 2008 的功能在 2005 年和 2000 年唯一的解决方案,如果我们将 select 与 union all 一起使用插入多个值是可能的,但是如果我在单行中使用与 2008 年相同的多值语法怎么办?我们可以为复杂性进行回溯吗?我的意思是多值代码将在 2005 年和 2000 年运行而不做任何更改它..?
    【解决方案2】:

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

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

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

    来自经验的警告: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 的查询之外,但它仍然失败。解决方案是使用子查询的结果构建一个临时表或表变量,并将其连接到我们的稀疏表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2013-01-05
      • 2011-03-23
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      相关资源
      最近更新 更多