我知道嵌套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
答案 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
答案 2 :(得分:0)
我正在使用OBJECT_ID来检查内部过程中临时表的存在,以确保我们没有嵌套的插入执行场景。
当我们检查表是否仅存在时,我们将创建表并将其插入到表中。
我在下面提供了示例代码供您参考。
sqlalchemy.exc.OperationalError: (MySQLdb._exceptions.OperationalError) (1045, "Access denied for user 'root'@'localhost' (using password: YES)")