我有一个存储过程,我们称它为存储过程'B‘。存储过程'B‘调用存储过程'A’,后者返回一个结果集,该结果集需要插入到存储过程'B‘内的临时表中,以便进行进一步的突变。由于嵌套插入,我使用了OPENROWSET (也尝试了OPENQUERY )。
现在,它似乎工作得很好!但是,除了返回结果集之外,存储过程'A‘还会在表中执行插入操作。奇怪的是,当从存储过程'B‘中执行存储过程'A’时,存储过程'A‘只返回结果集,根本不插入。它似乎只是跳过了整个INSERT INTO语句。我尝试过在插入之前和之后放置虚拟SELECT 'test'断点,它们都可以很好地执行!这怎麽可能?
这个查询看起来像这样(我稍微修改了数据和列):
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'INSERT INTO #Temp (1,2,3)
SELECT * FROM OPENROWSET (
''SQLOLEDB'',
''Server=(local);TRUSTED_CONNECTION=yes;'',
''SET FMTONLY OFF EXECUTE StoredProcedureA
@Parameter1 = '''''+@InputValue1+'''''
,@Parameter_2 = '''''+@InputValue2+'''''
''
)'
EXEC(@SQL) 不会返回任何错误。结果集(SELECT statement from procedure A)在过程B中被正确地加载到#Temp中,但是在过程A中完成的INSERT不会被执行。
openquery/openrowset是否不允许插入,而只允许执行SELECT输出?我想,也许这是一个安全/权利问题?有没有其他方法来解决这个问题?
提前感谢,伙计们!
发布于 2017-11-23 04:18:43
这是因为您使用的是由#表示的临时表。此表的作用域在嵌套存储过程结束并删除临时表时结束。
所以插入发生了,表就不复存在了。
如果您在开始嵌套过程之前创建表,则可以解决此问题。如果您真的想删除该表,则可以在过程B中删除它。
https://stackoverflow.com/questions/47441534
复制相似问题