存储过程适用于SQL Server 2000,但不适用于SQL Server 2008R2

时间:2016-06-15 09:25:19

标签: sql-server sql-server-2008 stored-procedures sql-server-2000

我将数据库从SQL Server 2000传输到SQL Server 2008 R2 SP2,除一个存储过程外,所有工作正常。错误出现在以下代码中:

declare @Dates table (
    ForDate    smalldatetime,
    DayStart   int,
    PRIMARY KEY CLUSTERED (ForDate)
)

INSERT INTO @Dates
   SELECT M.ForDate
   FROM @Master M
   GROUP BY M.ForDate

错误是:

  

Msg 213,Level 16,State 1,Procedure REP_Media,Line 115
  列名或提供的值数与表定义不匹配。

我意识到发生错误是因为DayStart表变量中没有为列@Dates提供的值。我可以在内部选择中添加NULL,一切正常。

但是相同的过程适用于SQL Server 2000,而不适用于SQL Server 2008 R2 SP2,为什么?如果不改变程序(某些服务器选项或其他解决方案),应该如何进行正常操作?

我尝试在过程定义和数据库选项中使用SET ANSI_NULL_DFLT_ON ON,但没有任何成功。

1 个答案:

答案 0 :(得分:3)

除了更新SQL之外,您无法做任何事情。

最近版本的SQL Server只是不允许您在insert...select列表中使用的项目数少于列列表中的SELECT。您没有明确的列列表,因此它隐含为除标识,时间戳,计算之外的所有列。

即。 (ForDate, DayStart)

即使DayStart可以为空,您仍然需要更改语法以使用显式列列表,以便从单个列SELECT

中获取该列表
INSERT INTO @Dates (ForDate)
SELECT M.ForDate
FROM @Master M
GROUP BY M.ForDate

这似乎是来自SQL Server 2000的change in behaviour(也是found her e),但我没有看到2000行为documented并使用SQL Server 2000兼容模式没有帮助。