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

如何创建SQL存储过程动态读取表列表并批量插入数据?

动态批量从多个表导入数据到目标表的存储过程实现

你可以通过动态SQL结合游标来实现这个需求,以下是具体步骤和代码:

前提确认

假设你存储表名的表为 Table_List,结构如下(可根据实际调整):

CREATE TABLE Table_List (
    ID INT PRIMARY KEY,
    TableName NVARCHAR(128) NOT NULL -- 存储需要导入的表名
)

存储过程代码

CREATE PROCEDURE dbo.ImportDynamicTablesToListUnion
AS
BEGIN
    SET NOCOUNT ON;

    -- 声明变量存储表名
    DECLARE @TableName NVARCHAR(128);
    -- 声明游标遍历所有需要导入的表
    DECLARE tableCursor CURSOR FOR
        SELECT TableName FROM Table_List;

    OPEN tableCursor;
    FETCH NEXT FROM tableCursor INTO @TableName;

    -- 循环处理每个表
    WHILE @@FETCH_STATUS = 0
    BEGIN
        BEGIN TRY
            -- 动态生成INSERT语句,用QUOTENAME避免SQL注入和特殊字符问题
            DECLARE @SQL NVARCHAR(MAX) = N'
                INSERT INTO [LIST_UNION] ([1], [2], [3])
                SELECT [1], [2], [3] FROM ' + QUOTENAME(@TableName);

            -- 执行动态SQL
            EXEC sp_executesql @SQL;

            PRINT '成功导入表: ' + @TableName;
        END TRY
        BEGIN CATCH
            PRINT '导入表 ' + @TableName + ' 失败: ' + ERROR_MESSAGE();
        END CATCH

        FETCH NEXT FROM tableCursor INTO @TableName;
    END

    -- 关闭并释放游标
    CLOSE tableCursor;
    DEALLOCATE tableCursor;
END

关键说明

  • 游标遍历:通过游标读取Table_List中的所有表名,逐个处理,适配每周更新的表列表。
  • 动态SQL:用sp_executesql执行拼接的INSERT语句,确保每次处理不同的目标表。
  • 安全处理:使用QUOTENAME()函数包裹表名,避免SQL注入风险,同时兼容包含特殊字符的表名。
  • 错误隔离:通过TRY/CATCH捕获单个表导入失败的情况,不会中断整个批量任务,同时输出错误信息便于排查。

使用方式

执行存储过程即可完成批量导入:

EXEC dbo.ImportDynamicTablesToListUnion;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:45:30