我将数据库从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
,但没有任何成功。
答案 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兼容模式没有帮助。