首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态SQL语句中的EXEC过程只执行SELECT而不执行INSERT

动态SQL语句中的EXEC过程只执行SELECT而不执行INSERT
EN

Stack Overflow用户
提问于 2017-11-23 02:23:22
回答 1查看 67关注 0票数 0

我有一个存储过程,我们称它为存储过程'B‘。存储过程'B‘调用存储过程'A’,后者返回一个结果集,该结果集需要插入到存储过程'B‘内的临时表中,以便进行进一步的突变。由于嵌套插入,我使用了OPENROWSET (也尝试了OPENQUERY )。

现在,它似乎工作得很好!但是,除了返回结果集之外,存储过程'A‘还会在表中执行插入操作。奇怪的是,当从存储过程'B‘中执行存储过程'A’时,存储过程'A‘只返回结果集,根本不插入。它似乎只是跳过了整个INSERT INTO语句。我尝试过在插入之前和之后放置虚拟SELECT 'test'断点,它们都可以很好地执行!这怎麽可能?

这个查询看起来像这样(我稍微修改了数据和列):

代码语言:javascript
复制
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输出?我想,也许这是一个安全/权利问题?有没有其他方法来解决这个问题?

提前感谢,伙计们!

EN

回答 1

Stack Overflow用户

发布于 2017-11-23 04:18:43

这是因为您使用的是由#表示的临时表。此表的作用域在嵌套存储过程结束并删除临时表时结束。

所以插入发生了,表就不复存在了。

如果您在开始嵌套过程之前创建表,则可以解决此问题。如果您真的想删除该表,则可以在过程B中删除它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47441534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档