【发布时间】:2011-04-09 22:24:45
【问题描述】:
我今天遇到了一个兼容性问题,因为客户从 Windows XP 升级到 Windows 7。
(12 岁的代码)正在调用 SQL Server 上的存储过程,称为
ai_nextid
除了调用存储过程时使用的名称:
ai_nextid;1
是的,附加了“;1”。显然,Windows 95、Windows 2000、Windows XP 和可能的 Windows Vista 中的 SQL Server 驱动程序都可以使用这个特别添加的后缀。但 Windows 7 中的 SQL Server ODBC 驱动程序不同,导致错误:
一般 SQL 错误。
[Microsoft][ODBC SQL 驱动程序][SQL Server]找不到存储过程 'ai_nextid;1'。
[Microsoft][ODBC SQL 驱动程序][SQL Server]指示变量需要但未提供'。
带有原生错误2812。
这带来了 4 个问题:
- 为什么我们要在存储过程名称的末尾附加
;1? (它的作用是什么) - 为什么 SQL Server 驱动程序忽略它?
- 为什么在 Windows 7 中进行了重大更改?
- 是否记录了重大兼容性更改?
最后两个问题可能是相同的,因为如果他们记录它,他们会证明它是合理的。
【问题讨论】:
-
这是numbered stored procedures 的语法。您的存储过程是否实际编号或
;1是否只是默认为未编号版本? -
什么都知道。存储过程实际上被声明为
CREATE PROCEDURE ai_nextid;1 ...。谁知道? -
如果他们都只使用
;1,您可以将所有程序写入一个文件,然后搜索用空字符串替换;1。运行该脚本文件并在调用存储过程的应用程序中执行相同的搜索/替换。 -
令我感兴趣的是,Delphi 2010 仍然为新的 TADOStoredProcs 添加了后缀默认值,即使我们没有在我们的数据库中使用它们。该列表仍以 Foo;1、Bah;1 等形式返回。Martin 的链接对于找出这一点很有用。如何解决它...我不知道。但是我们的客户端应用程序可以在带有后缀的 XP 和 Win7 上运行。
标签: sql-server delphi stored-procedures windows-7 compatibility