You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Synapse Analytics中如何将EXEC结果插入临时表?

在Azure Synapse Analytics中使用INSERT INTO...EXEC的问题解答

首先直接给结论:Azure Synapse Analytics的专用SQL池(原SQL Data Warehouse)目前不支持INSERT INTO <表> EXEC <存储过程/动态SQL>这种语法,这正是你遇到Msg 103010语法错误的核心原因。Synapse的SQL方言和传统SQL Server存在差异,该语法不在其支持的T-SQL特性列表中。

下面给你几个可行的替代方案,覆盖存储过程和动态SQL场景:

方案1:修改存储过程,直接在内部写入临时表

如果你有权限调整目标存储过程,可以把数据写入逻辑整合到存储过程内部,调用后直接使用生成的临时表:

CREATE PROCEDURE dbo.test
AS
BEGIN
    -- 在存储过程内创建并填充临时表
    CREATE TABLE #t1 (id INT);
    INSERT INTO #t1 SELECT 1;
END;

-- 调用存储过程后,直接查询临时表
EXEC dbo.test;
SELECT * FROM #t1;

方案2:调整动态SQL的执行逻辑

如果是动态SQL场景,不要试图把EXEC的结果插入临时表,而是把插入逻辑直接整合到动态SQL语句中:

-- 先创建目标临时表
CREATE TABLE #t1 (id INT);
-- 构建包含插入逻辑的动态SQL
DECLARE @dynamicSql NVARCHAR(MAX) = N'INSERT INTO #t1 SELECT 1;';
-- 执行动态SQL
EXEC sp_executesql @dynamicSql;

-- 验证结果
SELECT * FROM #t1;

方案3:使用永久表/外部表作为中间层(适合复杂场景)

如果临时表的生命周期需要跨多个会话,或者无法修改目标存储过程,可以用临时永久表(记得用完清理)或外部表作为数据中转:

-- 创建临时中转用的永久表
CREATE TABLE dbo.temp_intermediate (id INT);
-- 调整存储过程将数据写入该表
CREATE PROCEDURE dbo.test
AS
BEGIN
    INSERT INTO dbo.temp_intermediate SELECT 1;
END;

EXEC dbo.test;
-- 读取数据后及时清理
SELECT * FROM dbo.temp_intermediate;
DROP TABLE dbo.temp_intermediate;

另外需要注意:Synapse中的本地临时表(#开头)仅在当前会话可见,全局临时表(##开头)对所有会话可见,使用时要注意并发冲突问题。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:12:43