【发布时间】:2016-02-09 15:44:47
【问题描述】:
这个问题是 Microsoft ODBC 中一系列错误的一部分 司机:
- ODBC driver fails to raise errors; but instead suppresses them
- Reading columns out of order returns incorrect results
- Cannot execute a stored procedure that is a SYNONYM
微软已经表示他们不会在他们的 ODBC 中修复这些错误 司机。
我有(许多)实际上是同义词的存储过程。存储过程规范地存在于一个数据库中,但在其他数据库中可见。
存储过程可以在 SQL Server Management Studio 中正常执行:
EXECUTE Report_ThirdParty @ContosoGUID = '{CC0ECA32-BEFA-11E5-8E2A-C86000D0B92A}'
如果我使用任何 OLEDB 提供程序连接到 SQL Server:
-
SQL Server Native Client 10.0 OLE DB 提供程序:
Provider=SQLNCLI10;Data Source=contoso.stackoverflow.com;User ID=ContosoManager;Password=correct horse battery staple; -
用于 SQL Server 的 Microsoft OLE DB 提供程序:
Provider=SQLOLEDB;Data Source=contoso.stackoverflow.com;User ID=contoso.stackoverflow.com;Password=correct horse battery staple;
然后存储过程执行良好。我得到结果。每个人都很开心。
但不使用 ODBC 驱动程序
对于the announcement of the deprecation of OleDb drivers,我想使用 SQL Server 的 ODBC 驱动程序进行测试。当我更改连接以使用 SQL Server ODBC 驱动程序之一(例如 "{SQL Server}")并执行相同的 SQL 语句
EXECUTE Report_ThirdParty @ContosoGUID = '{CC0ECA32-BEFA-11E5-8E2A-C86000D0B92A}'
我得到错误:
对过程“Report_ThirdParty”的请求失败,因为“Report_ThirdParty”是同义词对象
无论我使用 SQL Server 的原始 ODBC 驱动程序还是本机客户端,这都是正确的:
SQL Server:
Provider=MSDASQL;Driver={SQL Server};Server={contoso.stackoverflow.com};UID={contosoManager};PWD={correct horse battery staple};SQL Server Native Client 11.0:
Provider=MSDASQL;Driver={SQL Server Native Client 11.0};Server={contoso.stackoverflow.com};UID={ContosoManager};PWD={correct horse battery staple};
在这两种变体中,我得到相同的错误:
[Microsoft][SQL Server Native Client 11.0][SQL Server]对过程“Report_ThirdParty”的请求失败,因为“Report_ThirdParty”是同义词对象
或者对于旧的 ODBC 驱动程序:
[Microsoft][ODBC SQL Server Driver][SQL Server]对过程“Report_ThirdParty”的请求失败,因为“Report_ThirdParty”是同义词对象
换句话说:
对过程“%s”的请求失败,因为“%s”是同义词对象
Connection 的Errors 集合提供了更多信息:
-
错误#1
- 编号: 0x80040E14
- 来源: Microsoft OLE DB Provider for ODBC Drivers
- 说明: [Microsoft][ODBC SQL Server Driver][SQL Server]对过程“Report_ThirdParty”的请求失败,因为“Report_ThirdParty”是同义词对象。
- SQLState: 37000
- NativeError:2809
-
错误#2
- 编号: 0x80040E14
- 来源: Microsoft OLE DB Provider for ODBC Drivers
- 说明: [Microsoft][ODBC SQL Server Driver][SQL Server]游标未声明。
- SQLState: 37000
- NativeError: 16945
放弃切换到 ODBC 并没有什么坏处。而且我不会停止使用同义词。
但是出了什么问题,我该如何告诉 SQL Server 的 ODBC 驱动程序工作?
SQL Profiler 结果
- RPC:Starting: declare @p1 int set @p1=0 declare @p3 int set @p3=16388 declare @p4 int set @p4=8193 declare @p5 int set @p5=0 exec sp_cursoropen @p1 输出,N'EXECUTE Report_ThirdParty @ContosoGUID = ''{3492C4E6-D500-4A23-9CAB-CB6582C27ABD}''',@p3 输出,@p4 输出,@p5 输出选择@p1,@p3,@p4 , @p5
- 异常:错误:2809,严重性:18,状态:1
- 用户错误消息:对过程“Report_ThirdParty”的请求失败,因为“Report_ThirdParty”是同义词对象。
- 异常:错误:16945,严重性:16,状态:2
- 用户错误消息:光标未声明。
- RPC:Completed: : 声明@p1 int set @p1=0 声明@p3 int set @p3=16388 声明@p4 int set @p4=8193 声明@p5 int set @p5= 0 exec sp_cursoropen @p1 输出,N'EXECUTE Report_ThirdParty @ContosoGUID = ''{3492C4E6-D500-4A23-9CAB-CB6582C27ABD}''',@p3 输出,@p4 输出,@p5 输出选择@p1,@p3,@ p4,@p5
注意事项
- 本机(即非 .NET)代码。您可以假装它是 C、C++、汇编或 Delphi。
- Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
ODBC 的其他意想不到的功能(在 OLEDB 中工作)
- 堆栈溢出:Reading columns out of order returns incorrect results
- 堆栈溢出:Cannot execute a stored procedure that is a SYNONYM
- 堆栈溢出:ODBC driver suppresses errors
阅读奖励
【问题讨论】:
-
您是否运行过跟踪并捕获了 ODBC 正在发送的命令文本?
-
ODBC 驱动程序总是会调用 sp_cursoropen,对我来说,我看到与您在带有 SP 同义词的 SSMS 中使用相同的错误,因此它可能与该系统 SP 的实现有关,还有其他问题研究
-
我无法使用 C++ 和 Sql Server 本机客户端 11 在 Sql Server 2014 中重现此问题。但在我的简单测试用例中,存储过程和同义词都在同一个数据库中。
标签: sql-server winapi odbc