所以我在varchar变量中声明了一个查询,例如:
DECLARE @sql VARCHAR(MAX) = 'select * from table'
我还声明了一个与查询的列结构匹配的临时表@Results。
然后我打电话给
INSERT INTO @Results
EXEC (@sql)
我得到的错误是:
不能嵌套INSERT EXEC语句。
我还想补充一点,查询没有部分执行得很好
INSERT INTO @Results
可能是什么原因引起的?任何提示将不胜感激
答案 0 :(得分:1)
最多不能堆叠1个scl enable devtoolset-7 bash && make
,这是SQL Server的限制。
INSERT INTO + EXEC
消息8164,级别16,状态1,第4行不能执行INSERT EXEC语句 嵌套。
如果我们删除内部的DECLARE @Test TABLE (Number INT)
INSERT INTO @Test (Number)
EXEC ('
CREATE TABLE #InnerTable (SomeColumn INT);
INSERT INTO #InnerTable (SomeColumn)
EXEC (''SELECT 1'');
SELECT 1;')
...
INSERT INTO + EXEC
成功!
有多种方法可以解决此限制,但是大多数方法都需要修改DECLARE @Test TABLE (Number INT)
INSERT INTO @Test (Number)
EXEC ('
CREATE TABLE #InnerTable (SomeColumn INT);
SELECT 1;')
内容。您可以找到详尽的说明here。我通常在过程中使用的是共享一个临时表。您需要在EXEC
外部创建一个临时表,然后将其装入内部。该表在EXEC
范围之外仍然可以访问,因为它是在外部创建的。
EXEC
该方法的缺点是,如果未创建临时表或使用错误的列名或数据类型创建了临时表,则IF OBJECT_ID('tempdb..#Test') IS NOT NULL
DROP TABLE #Test
CREATE TABLE #Test (Number INT)
EXEC ('INSERT INTO #Test (Number) SELECT 1')
SELECT * FROM #Test
部分可能会失败。请记住,这不适用于变量表,它们必须是临时的(至少)才能在EXEC
范围内访问。