避免“INSERT EXEC语句不能嵌套”

时间:2016-01-26 09:30:31

标签: sql sql-server insert-into

我知道嵌套insert ... exec语句是不可能的,但我仍然感兴趣 - 有没有办法检查我是否已经有insert ... exec来避免实际错误?

所以我希望有这样的东西:

....
if <check if I have outer insert into exec> = 0
    insert into <#some temporary table>
    exec <stored procedure>

换句话说 - insert ... exec是可选的,很高兴拥有它,但如果有人试图用外insert ... exec

调用我的程序,我想跳过它

3 个答案:

答案 0 :(得分:2)

here

所述
  

当尝试从计算机中“冒泡”数据时,这是一个常见问题。   存储过程链。 SQL Server中的一个限制是您可以   一次只能激活一个INSERT-EXEC。我建议看   How to Share Data Between Stored Procedures这是非常   有关解决此类问题的模式的详尽文章。

尝试使用OpenRowset

INSERT INTO #YOUR_TEMP_TABLE
SELECT * FROM OPENROWSET ('SQLOLEDB','Server=(local);TRUSTED_CONNECTION=YES;','set fmtonly off EXEC [ServerName].dbo.[StoredProcedureName] 1,2,3')

答案 1 :(得分:2)

天真的方法是使用TRY/CATCH块:

BEGIN
DECLARE @isNested BIT = 0;

  BEGIN TRY
      BEGIN TRANSACTION;
      EXEC p2;
      ROLLBACK;  --COMMIT;
  END TRY
  BEGIN CATCH
    -- Msg 8164 An INSERT EXEC statement cannot be nested.
    IF ERROR_NUMBER() = 8164 SET @isNested = 1;
    ROLLBACK;
  END CATCH

SELECT @isNested;
END

db<>fiddle demo

答案 2 :(得分:0)

我正在使用OBJECT_ID来检查内部过程中临时表的存在,以确保我们没有嵌套的插入执行场景。

当我们检查表是否仅存在时,我们将创建表并将其插入到表中。

我在下面提供了示例代码供您参考。

sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")