从另一个存储过程通过经典ASP调用存储过程的问题

从另一个存储过程通过经典ASP调用存储过程的问题

问题描述:

我们有一个经典的ASP应用程序,它的工作原理很简单,我们不愿意修改代码以免引起一些长期死亡的希腊神的愤怒。从另一个存储过程通过经典ASP调用存储过程的问题

我们最近有要求将功能添加到应用程序。功能实现实际上只是一个数据库操作,只需对UI进行最小限度的更改。

我改变了用户界面,并做了小修改,以提交一个新的数据值到存储过程调用(sproc1)。

在直接从ASP调用的sproc1中,我们向恰好位于另一个服务器sproc2上的另一个sproc添加了一个新调用。

不知何故,这不能通过我们的ASP应用程序工作,但可以在SQL Management Studio中工作。

这里的技术细节:两个数据库服务器上

  1. SQL 2005。
  2. Sql登录正在从ASP应用程序向SQL 2005服务器1进行身份验证。
  3. 服务器1到服务器2的链接服务器正在工作。
  4. 从SQL Management Studio执行sproc1时 - 工作正常。即使当我们的代码使用相同的用户时(应用程序sql登录)。
  5. 当从SQL Management Studio独立于sproc1调用sproc2时,sproc2可以工作。
  6. VBScript(ASP)捕获XML中返回给客户端的错误。错误编号为0,错误描述为空。无论是从ADODB.Connection对象还是从ASP端的VBScript中产生的任何Err.Number/Err.Description。

所以没有任何错误,也没有任何可重复性(即通过SQL Mgmt Studio) - 有谁知道这个问题吗?

我们目前的计划是打破并深入ASP端的代码,并直接从ASP完全独立地调用Server 2.sproc2,而不是试图通过sproc1捎带回来。

+0

找到相同的问题,有关更多的背景信息可能在这里的问题:http://*.com/questions/605996/ms-sql-suppress-return-value-of-stored-procedure-called-in -stored-procedure – BlaM 2009-03-03 11:20:06

我的第一反应是,这可能不是一个调用跨服务器的问题,而是从第一个调用第二个proc的问题,而那个这个可能是两种不同环境中的行为不同。

我的第一个问题是:如果从等式中删除跨服务器方面会发生什么?如果你可以建立一个测试系统,你的第一个进程调用你的第二个进程,但第二个进程在同一个服务器上和/或在同一个数据库中,你是否仍然遇到同样的问题?

沿着同样的道路:根据我的经验,当应用程序和SSMS得到不同的结果时,它通常是存储过程设置的问题。正如卢克所说,它可能是NOCOUNT。虽然我似乎记得PRINTED值成为错误描述的一部分(非常违反直觉),但我已经在代码中发生了多余的PRINT语句。

如果任何东西在消息窗口中返回,当你在SSMS中运行它时,找出它来自哪里并使其停止。我将不得不查看技术术语,但我的回忆是,不同的查询环境对“错误”具有不同的敏感度,并且通过SSSM的默认连接不会在某些时候发生错误,即来自脚本语言的ADO连接将。

最后一个想法:万一它是一个环境的东西,请尝试ASP页面的连接字符串不同的设置。例如,如果您有OLEDB连接,请尝试ODBC。尝试使用本地和非本地SQL Server驱动程序。查看你的提供者支持哪些连接字符串选项,并尝试其中任何看起来可能值得尝试的选项。

+0

我终于能够实现这个代码。我从ASP打出了对SPROC2的呼叫。仍然错误!我回顾了NOCOUNT和PRINT(以及其他任何可以提供输出的代码)的代码,但无济于事。我最终写了一个黑客,因为错误号= 0始终如一。 – Aaron 2008-09-23 04:40:21

你可以从double-hop problem

双跃点问题是痛苦是当ASP/X页尝试使用位于是从IIS服务器不同的服务器上的资源。

Windows NT质询/响应does not support双跃模拟(在传递给IIS服务器后,相同凭证无法传递到后端服务器进行身份验证)。

您应该使用SQL事件探查器验证尝试的第二个连接。

请注意,通过您的手动测试,您不通过IIS进行身份验证。只有当你通过ASP/X页面启动sql时,这个问题才会显现出来。

更多资源:

示例代码可以帮助:)你试图返回从存储过程两个表;我不认为ADO 2.6可以处理多个表被返回。

我确实认为(双跳),但是像我指的是一个存储过程的调用与通过INNER JOIN的典型的跨服务器联接之间有什么区别?两者都将在服务器1上执行,使用链接服务器凭据并向服务器2进行身份验证。

任何人都可以确认调用超级跨服务器与在数据表上进行连接不同吗?为什么?

如果链接的服务器配置是一个SQL帐户 - 这算是一个双跳(因为你指的是NTLM双跳?)

在多个结果是否都回来了条件 - 没有。 Server1.Sproc1和Server2.Sproc2都将是.net世界中的“ExecuteNonQuery()”,并且不会返回任何内容(没有结果集,也没有返回值)。

尝试检查连接字符串中指定的用户对数据库的权限。 在使用sql mgmt studio时,在连接字符串中使用相同的用户名登录数据库。

创建一些临时表来编写中间值和异常,因为它可以成为调试应用程序的有效方式。

你有设置在设置nocount在这两个存储过程?我曾经有过类似的问题,虽然我现在还记不清我是怎么解决它的,但我知道这跟它有关系。

我可以检查:您是否增加了sproc2?在此之前,它工作很好很多年了。

难道你不能改变你从哪里调用sproc2吗?而不是从sproc1内部调用它,你可以从ASP调用它吗?通过这种方式,您可以在代码中控制对SQL的身份验证,而不必依赖在服务器上设置任何信任或共享远程身份验证。

您的链接服务器是如何设置的?通常您可以选择如何向远程服务器进行身份验证,其中包括以当前登录的用户身份登录或指定要始终使用的SQL登录名。您是否尝试将其设置为始终使用特定帐户?这应该消除调用远程过程中的任何可能的权限问题...

我有一个类似的问题,我通过设置nocount和删除打印命令来解决它。