【问题标题】:EXEC procedure in dynamic SQL statement only does SELECTs and not INSERTs动态 SQL 语句中的 EXEC 过程仅执行 SELECT 而不执行 INSERT
【发布时间】:2018-05-06 14:17:11
【问题描述】:

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

现在,它似乎工作得很好!但是,除了返回结果集之外,存储过程“A”还在表中执行 INSERTS。奇怪的是,当从存储过程“B”中执行存储过程“A”时,存储过程“A”只返回结果集,根本不插入。它似乎只是跳过了整个INSERT INTO 语句。我尝试在 INSERT 之前和之后放置虚拟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 是否不允许 INSERTS 并且只执行 SELECT 输出?我想,也许它是一个安全/权利问题?有没有其他方法可以解决这个问题?

提前谢谢各位!

【问题讨论】:

    标签: sql sql-server function stored-procedures sql-server-2014


    【解决方案1】:

    这是因为您使用的是用# 表示的临时表。 当您的嵌套存储过程结束并删除临时表时,此表的范围就结束了。

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

    如果您在开始嵌套过程之前创建表,则可以解决此问题。如果您真的希望它消失,您可以将表格放入您的程序 B 中。

    【讨论】:

      猜你喜欢
      • 2016-09-11
      • 2019-03-13
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多