从 .Net 的另一个存储过程调用时出现"无效列"



我已经在现有存储过程(" parent''(结束时,我已将呼叫添加到SQL Server存储的过程(我们称其为" Child"(。当我的帐户和正在运行生产过程中运行Procs的服务帐户的SSM运行时,儿童和父母(再次包括子(成功运行。

当我直接使用sqlclient.sqlcommand.executenonquery((调用直接从.NET应用程序运行孩子时,它会成功运行。但是,当我使用相同连接运行父行动时,它会在子女内部使用"无效列'x'"的错误。

我已经确认的事情:

  • 对儿童中X的每个引用都与相关视图或表相称,而"行号" exception returns实际上并不是包括X的查询行。

  • 所有表/视图包含此列

  • 儿童Proc成功运行了自己的"自己的",甚至在大多数情况下是在父母的范围内运行

  • 所有帐户都有适当的执行权限,选择和插入需要的数据

  • 父母已经从同一数据库运行其他存储过程。

为什么只有从.NET应用程序调用时,此PROC才会抛出错误?

浏览了profiler的跟踪后,第一个错误是说其中一个临时表是无效的对象。我明确创建了proc中的表,而不是使用"插入"语句并修复了该表。

奇怪的

编辑:

进一步研究之后,这是因为父母和孩子都有一个名为同一件事的临时表,而孩子proc正在更新其临时表,其中包含父母临时表中不存在的任何列。

玩具代码:

CREATE PROCEDURE parent
AS
BEGIN
    select top 100 *
    into #tempTable
    from sys.all_parameters
    exec Financial.dbo.child
END
GO
CREATE PROCEDURE child
AS
BEGIN
    select *
    into #tempTable --changing this temp table name will solve the issue
    from sys.all_columns
    update #tempTable
    set column_id = 1  --this will throw an error when called from .Net code below
    where collation_name is null  --and this will throw an error when called from .Net code below
END
GO

和.net:

System.Data.SqlClient.SqlCommand cmd = new SqlCommand("parent", SqlClient.SqlConnection);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
cmd.ExecuteNonQuery();

相关内容

  • 没有找到相关文章

最新更新