您如何解决SQL查询失败问题?

时间:2010-09-17 05:36:06

标签: sql-server tsql

我有一个SQL查询,有时会失败。这意味着查询在大多数情况下运行良好。一旦查询失败,如果我再次执行有一些延迟,它在同一执行中成功。

请注意,在成功和失败方案之间的查询中使用的表没有变化。它们完全相同。如下所述,查询连接几个表,查询结果应为空。但有时ADO会抛出错误。

如何找出问题的根本原因?

我故意遗漏了一些细节,因为我有兴趣了解SQL查询失败的通用问题解决方法。


以下是有关任何特定替代方法的一些细节。

  • Microsoft SQL Server 2008
  • 查询使用连接两个表
  • 查询从.NET传递到interop,COM组件处理ADO以执行查询。
  • 错误信息0x80004005(-2147467259)[DBNETLIB] [ConnectionOpen(Connect())。] SQL Server不存在或访问被拒绝。

更新

对于这个特定问题,我认为客户端用完了可用的TCP端口。根据默认设置,5000端口是TCP端口的最大数量。在我的例子中,ADO创建隐式连接,每次进行查询时都会创建TCP端口。

netstat告诉我,当我运行工作流程时,打开的端口数量会急剧增加。在大约4000个端口处查询失败(0-1023是保留端口)。 Jibcov Dobrev在here的回答指出了正确的方向。

5 个答案:

答案 0 :(得分:3)

阅读错误消息!

查询只会因为某些原因而“失败”:

  • 唯一或检查或其他违反约束
  • 数据类型问题(不匹配,溢出)
  • ???

在解析时将拾取不正确或相互矛盾的聚合或语法。但...

  • 使用动态SQL然后它可能“失败”,因为它在语法上是错误的

它可能很慢或提供错误数据,但这不是“失败”。

编辑:

这不是查询错误:它是与任何SQL命令无关的连接错误。

通常,您现在需要确定它是与一个客户有关还是一般性问题

答案 1 :(得分:2)

SQL查询失败的“通用问题解决方法”与任何其他代码失败相同:

  • 确定 做什么。
  • 确定应该做什么。
  • 确定原因不同。
  • 修复它。

编辑: 在提供更具体的信息之后,以下Microsoft知识库文章:http://support.microsoft.com/kb/328306讨论了解决此问题的可能原因和方法。

答案 2 :(得分:2)

“潜在原因”知识库文章省略了解决它的问题 - “当您的应用程序处于高压力情况时,您无法使用SQL Server的OLE DB提供程序访问SQL Server数据库”{{3 }}

在这种情况下 - 进程运行一段时间,在错误发生之前检索数据OK。

运行'netstat -an'将显示进程运行时打开的所有ips /端口。对我来说,这些都是20左右,直到达到某个代码块...然后迅速上升到4000+并且应用程序失败

答案 3 :(得分:1)

你可以:

运行sql profiler捕获查询,确保查询格式正确。您可以根据需要保持跟踪运行。

在管理工作室中运行捕获的查询,sql server将丢弃它遇到的任何错误。

如果仍然没有帮助,可能会将查询拆分为多步存储过程..在每个步骤之前,在一个表/日志文件中记录值/参数等等,以便您可以在失败时识别一些常见因素。

甚至可以将构造的查询和结果记录在.net的日志文件中,并比较查询中的差异。

根据您设置数据连接的方式,visual studio还允许设备逐步执行存储过程。

答案 4 :(得分:0)

特定于

  

0x80004005(-2147467259)[DBNETLIB] [ConnectionOpen(Connect())。] SQL Server不存在或访问被拒绝。

这似乎是一个很好的调查起点:Potential causes of the "SQL Server does not exist or access denied" error message