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

Stored procedure works on SQL Server 2000 but not on SQL Server 2008R2

我将数据库从 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
Column name or number of supplied values does not match table definition.

我意识到错误的发生是因为没有为 @Dates table 变量中的 DayStart 列提供值。我可以将 NULL 添加到内部 select 并且一切正常。

但同样的过程在 SQL Server 2000 上有效,但在 SQL Server 2008 R2 SP2 上无效,为什么?在不改变程序(一些服务器选项或其他解决方案)的情况下正常运行应该做什么?

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

除了更新 SQL 之外,您无能为力。

SQL 最近版本的服务器根本不允许您使用 SELECT 列表中的项目少于列列表中的项目来执行 insert...select。您没有明确的列列表,因此暗示是除标识、时间戳、计算之外的所有列。

(ForDate, DayStart)

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

中应用
INSERT INTO @Dates (ForDate)
SELECT M.ForDate
FROM @Master M
GROUP BY M.ForDate

这似乎是 change in behaviour from SQL Server 2000 (also found here) but I don't see that 2000 behaviour documented 并且使用 SQL Server 2000 兼容模式没有帮助。