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

时间:2008-09-20 08:03:38

标签: sql-server stored-procedures asp-classic vbscript cross-server

我们有一个经典的ASP应用程序,只是工作,我们一直厌恶修改代码,以免我们引起一些长期死亡的希腊神的愤怒。

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

我更改了UI并进行了小修改,以便为sproc调用(sproc1)提交新的数据值。

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

不知何故,这不适用于我们的ASP应用程序,但适用于SQL Management Studio。

以下是技术细节:

  1. 两个数据库服务器上的SQL 2005。
  2. Sql Login正在从ASP应用程序向SQL 2005 Server 1进行身份验证。
  3. 从服务器1到服务器2的链接服务器正在运行。
  4. 从SQL Management Studio执行sproc1时 - 工作正常。即使我们的代码使用相同的用户(应用程序sql登录)。
  5. sproc2在从SQL Management Studio独立于sproc1调用时起作用。
  6. VBScript(ASP)捕获XML中发送的错误并返回给客户端。错误号为0,错误描述为空。来自ADODB.Connection对象和来自ASP端的VBScript中的Err.Number / Err.Description。
  7. 所以没有任何错误,也没有任何可重复性(即通过SQL Mgmt Studio) - 是否有人知道这个问题?

    我们当前的计划是分解并深入研究ASP端的代码,并直接从ASP完全单独调用Server 2.sproc2,而不是试图通过sproc1进行反馈。

9 个答案:

答案 0 :(得分:3)

您是否在两个存储过程中都设置了设置nocount ?我有一个类似的问题,虽然我不记得我此刻是如何解决的,但我知道这与它有关!

答案 1 :(得分:1)

您可能会受到double-hop problem

的影响

双跳问题是当ASP / X页面尝试使用位于与IIS服务器不同的服务器上的资源时。

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

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

请注意,通过手动测试,您无法通过IIS进行身份验证。只有当您通过ASP / X页面启动sql时才会出现此问题。

更多资源:

答案 2 :(得分:1)

我遇到了类似的问题,我通过设置nocount并删除打印命令解决了这个问题。

答案 3 :(得分:0)

示例代码可能有帮助:)您是否尝试从存储过程返回两个表;我不认为ADO 2.6可以处理多个返回的表。

答案 4 :(得分:0)

我确实考虑过(双跳),但是我所指的sproc-in-a-sproc调用与通过INNER JOIN进行的典型跨服务器连接之间的区别是什么?两者都将在Server1上执行,使用链接服务器凭据,并对服务器2进行身份验证。

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

如果链接服务器配置是一个sql帐户 - 被认为是双跳(因为你所指的是NTLM双跳?)

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

我可以检查一下:你加入了sproc2吗?在此之前,它的工作时间很长。

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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

我的第一个问题是:如果从等式中删除跨服务器方面会发生什么?如果您可以设置一个测试系统,其中您的第一个proc调用第二个proc,但第二个proc位于同一服务器和/或同一个数据库中,您是否仍会遇到相同的问题?

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

如果在SSMS中运行此消息窗口时返回任何,请找出它的来源并使其停止。我必须查阅技术术语,但我的回忆是不同的查询环境对“错误”有不同的敏感性,并且当来自脚本语言的ADO连接时,通过SSSM的默认连接不会在某些时候引发错误

最后一个想法:如果是环境问题,请在ASP页面的连接字符串上尝试不同的设置。例如,如果您有OLEDB连接,请尝试ODBC。尝试本机和非本机SQL Server驱动程序。查看您的提供商支持的连接字符串选项,并尝试其中任何看起来可能值得尝试的选项。