我已经在现有存储过程(" 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();