存储过程在SQL Server 2000上运行正常,但在SQL Server 2008R2上不起作用。

4

我将数据库从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
列名或列数与表定义不匹配。

我发现这个错误是因为在@Dates表变量中没有为DayStart列提供值。我可以在内部选择中添加NULL,所有内容都可以正常工作。
但是,相同的过程适用于SQL Server 2000,而不适用于SQL Server 2008 R2 SP2,为什么?应该采取什么措施以使其正常运行,而不改变过程(一些服务器选项或其他解决方案)?
我尝试在过程定义和数据库选项中使用SET ANSI_NULL_DFLT_ON ON,但没有任何成功。

2
这种写法实在是很糟糕的做法。在编写插入语句时,应该始终指定列列表。 - Zohar Peled
很遗憾,这不是我的代码,而且在使用数据库的应用程序中可能会出现这样的请求。 - Sergey
1个回答

3
除了更新SQL之外,您无法做任何事情。
最近版本的SQL Server不允许在SELECT列表中少于列列表中的项目时使用insert...select。 您没有显式的列列表,因此暗示为所有列,而不是标识,时间戳,计算出的列。
即(ForDate,DayStart)
即使DayStart是可空的,您仍需要更改语法以使用显式的列列表,以便从单个列SELECT源中应用它。
INSERT INTO @Dates (ForDate)
SELECT M.ForDate
FROM @Master M
GROUP BY M.ForDate

这似乎是与 SQL Server 2000(也在此处找到)的行为变化,但我没有看到2000年的行为有记录,并且使用 SQL Server 2000 兼容模式也没用。


其中“change in behaviour”需要翻译成“行为变化”,“found here”需要翻译成“也在此处找到”,“documented”需要翻译成“有记录”。

1
我从未知道那种行为的变化 - 一定抓住了很多人。 - Rhys Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接