当前位置: 首页 > 知识库问答 >
问题:

从 RPC 运行时没有语句运行的 SQL 服务器存储过程

江瀚昂
2023-03-14

我有一个SQL Server 2000数据库,它有一个存储过程,可以根据给定的id从特定的表中删除一行。当我从VB.NET调用存储过程时,它不会删除行,但是通过SSMS直接在数据库上运行相同的脚本,它可以工作。

以下是我的事件链:

    < li >启动SQL Server Profiler以监视对数据库的所有调用。我将它设置为跟踪存储过程何时开始、完成,甚至跟踪存储过程中SQL语句的开始/完成。 < li >通过VB.NET dll调用存储过程。 < li >停止探查器跟踪以避免挖掘过多的数据。 < li >从表中选择,并查看该行是否仍然存在。 < li >查看探查器跟踪,该跟踪仅显示RPC:正在启动、SP:正在启动、RPC:已完成。没有跟踪任何内部语句,这验证了为什么该行没有被删除,因为delete语句从未被触发。 < li >直接从RPC:Starting trace条目将EXEC调用复制/粘贴到SQL Server Management Studio查询窗口中,该窗口使用相同的凭据指向相同的数据库。 < li >再次启动profiler。 < li >在SSMS中执行第6项中的EXEC语句。 < li >停止探查器。 < li >从表中选择,并查看该行是否被删除。 < li >查看探查器跟踪,它显示SP:Starting、所有开始/完成的语句(包括DELETE语句)和SP:Completed。

为什么通过RPC运行它会使它不执行proc中的任何语句,而是直接运行它应该执行的操作?

编辑:以下是我的VB.NET代码。这是我们在100多个其他地方使用的相同代码:

Dim paramRowID as new SqlParameter(“@RowID”, sRowID) Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(oConn, “spDeleteRow”, paramRowID)

请参阅此处的 Sql 助手源代码。

编辑:我现在讨厌自己SQL抛出了一个异常“nvarchar与image不兼容”,该异常与我传递NULL的另一个参数有关。SSMS不担心类型,但VB.NET担心,因为我没有明确告诉它它类型为image。一旦我定义了参数,它就起作用了。我希望分析人员告诉我有一个错误。

任何帮助将不胜感激,

格雷格

共有2个答案

柳英资
2023-03-14

应用程序用来连接sql的用户是否有执行存储过程的权限?这是我要核实的第一件事。

商宏爽
2023-03-14

那是因为SSMS不调用RPC而是调用批处理。实际上没有办法从SSMS调用RPC,因为您无法声明参数,这就是RPC调用与TDS中批处理调用的区别:

2.2.1.3 SQL批处理要发送SQL语句或一批SQL语句,由Unicode字符串表示的SQL批处理被复制到TDS数据包的数据部分,然后发送到支持SQL的数据库服务器。SQL批处理可以跨越多个TDS数据包。更多详情见第2.2.6.6节

2.2.1.5远程过程调用要在服务器上执行远程过程调用(RPC),客户端向服务器发送一个RPC消息数据流。这是一个包含RPC名称或数字标识符、选项和参数的二进制流。RPC必须在单独的TDS消息中,不能与SQL语句混合。一条消息中可以有多个RPC。有关更多详细信息,请参阅第2.2.6.5节。

因此,改为监视< code>SQL:BatchCompleted事件,您将看到您的SSMS语句。

 类似资料:
  • 我在SQL Server中有一个数据库,其中包含一天内收集的数据,在PostgreSQL中有一个数据库,其中包含OSM数据。我需要修改收集的数据,以便为我的用户创建报告。 现在,我设想以某种方式从SQL Server调用PostgreSQL过程,将收集的数据传递给PostgreSQL,对这些数据进行处理,然后将另一个结果集返回给SQL Server以创建报告。 实现这一目标的“最有效”方式是什么?

  • 我正在尝试使用SQL server上的链接服务器运行Oracle存储过程。 存储过程是,它接受参数。 在SQL Server中,我这样执行它: 我遇到了这个错误: 链接服务器“LServer”的OLE DB提供程序“OraOLEDB. Oracle”返回消息“ORA-06550:第1行,第47列: PLS-00201:必须声明标识符“2016-06-26” ORA-06550:第1行,第7列: P

  • 是否可以通过使用@refreshScope的POST rest api/refresh调用来刷新属性(api-url)而无需安装spring cloud config server和spring cloud config client。 对于。例如consumer.java

  • 我在SAP HANA中定义了一个存储过程,其中包含3个in参数,返回一个记录集。当我用语法调用它时,它在HANA studio中运行得非常好。 现在我需要从微软SQL服务器调用它(我在2016年)。我有一个与HANA服务器的远程链接服务器连接,当使用和语法查询表和视图时,它可以正常工作。 我尽力了,但找不到调用远程过程的方法。“CALL sp_name(p,p,p)”语法返回“对象没有列或当前用户

  • 在我的项目中,我们使用的是最新版本的 Spring-Cloud-LoadBalancer、spring-cloud网关和Resilience4J。 JDK 1.8版 IDE-Eclipse Oxygen。2 一切看起来都很好,但应用程序仍然没有运行...

  • 问题内容: 当我尝试检入机器B时,我正在从机器A运行python manage.py runserver。我键入的URL是http:// A:8000 / 我收到类似系统返回的错误:(111)连接被拒绝 问题答案: 你可以通过以下方式为网络中的计算机运行它 这样一来,你就可以从网络中的任何计算机访问服务器。只需在浏览器中的其他机器上键入你服务器的IP地址…就可以开始使用…了。 或者在你的情况下: