【问题标题】:Stored procedure works on SQL Server 2000 but not on SQL Server 2008R2存储过程适用于 SQL Server 2000,但不适用于 SQL Server 2008R2
【发布时间】:2016-10-16 07:51:53
【问题描述】:

我将数据库从 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

错误是:

消息 213,级别 16,状态 1,过程 REP_Media,第 115 行
列名或提供的值的数量与表定义不匹配。

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

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

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

【问题讨论】:

  • 好吧,写这样的插入语句是很糟糕的做法。在编写插入语句时,您应该始终指定列列表。
  • 很遗憾,这不是我的代码,这样的请求可能会出现在使用数据库的应用程序的其他任何地方。

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


【解决方案1】:

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

最近版本的 SQL Server 根本不允许您在 insert...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 here),但我没有看到 2000 的行为 documented 并且使用 SQL Server 2000 兼容模式没有帮助。

【讨论】:

  • 我从来不知道这种行为上的变化——一定是吸引了很多人。
猜你喜欢
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2018-12-27
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多