从RPC运行时,SQL Server存储过程没有语句运行

时间:2012-10-09 17:56:43

标签: sql sql-server stored-procedures

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

这是我的一系列事件:

  1. 启动SQL Server Profiler以观察对数据库的所有调用。我有 它设置为跟踪存储过程何时启动,完成甚至是 在SQL语句中,在该存储过程中启动/完成。
  2. 通过VB.NET dll调用存储过程。
  3. 停止探查器跟踪以避免过多的数据挖掘。
  4. 从表格中选择,并看到该行仍然存在。
  5. 查看探查器跟踪,该跟踪仅显示RPC:Starting,SP:Starting,RPC:Completed。没有内部语句被跟踪,它会验证为什么行没有被删除,因为delete语句从未被触发。
  6. 直接从RPC复制/粘贴EXEC调用:从通过VB.NET调用时开始跟踪条目,进入指向具有相同凭据的同一数据库的SQL Server Management Studio查询窗口。
  7. 再次启动探查器。
  8. 执行SSMS中子弹6的EXEC声明。
  9. 停止分析器。
  10. 从表格中选择,并看到GOT DELETED行应该如此。
  11. 查看分析器跟踪,其中显示SP:Starting,所有开始/完成的语句,包括DELETE语句,以及SP:已完成。
  12. 为什么通过RPC运行它会使它不执行proc中的任何语句,而是直接运行它应该起作用?

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

    Dim paramRowID As New SqlParameter("@RowID", sRowID) Microsoft.ApplicationBlocks.Data.SqlHelper.ExecuteNonQuery(oConn, "spDeleteRow", paramRowID)

    请参阅SqlHelper源here

    编辑:我现在讨厌自己。 :) SQL抛出异常“nvarchar与图像不兼容”有关我传递NULL的另一个参数。 SSMS并不担心这种类型,但VB.NET确实没有明确告诉它它是类型图像。一旦我定义了那个参数,它就起作用了。我希望探查者会告诉我有一个错误。

    任何帮助将不胜感激,

    格雷格

2 个答案:

答案 0 :(得分:3)

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

  

2.2.1.3 SQL Batch要发送SQL语句或一批SQL语句,将由Unicode字符串表示的SQL批处理复制到TDS数据包的数据部分,然后发送到支持SQL的数据库服务器。 SQL批处理可能跨越多个TDS数据包。有关其他详细信息,请参阅第2.2.6.6节

     

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

因此,请监控SQL:BatchCompleted事件,您将看到您的SSMS声明。

答案 1 :(得分:0)

应用程序用于连接到sql的用户是否有权执行存储过程?这是我要验证的第一件事。