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

SQL Server跨无链路环境生成全量/筛选插入脚本实现数据迁移问询

以下所有方案均可以直接在SQL Server Management Studio的查询窗口执行,生成的结果就是可直接在生产环境运行的SQL脚本,无需额外工具依赖,完全适配生产环境无外部数据链路的要求。

1. 单表导出脚本

1.1 全量导出表数据

替换代码中的你的表名后执行,输出结果的每一行都是对应表一条记录的INSERT语句:

DECLARE @TableName NVARCHAR(128) = N'你的表名'
DECLARE @SQL NVARCHAR(MAX) = N''

SELECT @SQL = @SQL + N'INSERT INTO ' + QUOTENAME(@TableName) + N' (' + STUFF((
    SELECT N', ' + QUOTENAME(name) 
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(@TableName)
    AND is_identity = 0 -- 若需要保留自增列赋值,删除此行即可
    ORDER BY column_id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N') VALUES (' + STUFF((
    SELECT N', N''' + REPLACE(CAST(' + QUOTENAME(name) + ' AS NVARCHAR(MAX)), '''', '''''') + ''''
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(@TableName)
    AND is_identity = 0 -- 若需要保留自增列赋值,删除此行即可
    ORDER BY column_id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N');' + CHAR(13)
FROM sys.tables WHERE name = @TableName

SET @SQL = N'SELECT ' + QUOTENAME(@SQL, '''') + N' FROM ' + QUOTENAME(@TableName)
EXEC sp_executesql @SQL

1.2 按筛选条件导出(支持先删后插场景)

适配仅操作指定分类记录、不触碰用户数据的需求,替换你的表名和筛选条件后执行,输出结果开头为指定条件的DELETE语句,后面紧跟所有符合条件记录的INSERT语句,可直接在生产环境执行:

DECLARE @TableName NVARCHAR(128) = N'你的表名'
-- 替换为实际筛选条件,示例:Category = ''System'' AND Collection_Name = ''Status''
DECLARE @FilterCondition NVARCHAR(MAX) = N'你的筛选条件'
DECLARE @SQL NVARCHAR(MAX) = N''
DECLARE @DeleteSQL NVARCHAR(MAX) = N'DELETE FROM ' + QUOTENAME(@TableName) + N' WHERE ' + @FilterCondition + N';' + CHAR(13) + CHAR(13)

-- 生成插入语句模板
SELECT @SQL = @SQL + N'INSERT INTO ' + QUOTENAME(@TableName) + N' (' + STUFF((
    SELECT N', ' + QUOTENAME(name) 
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(@TableName)
    AND is_identity = 0
    ORDER BY column_id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N') VALUES (' + STUFF((
    SELECT N', N''' + REPLACE(CAST(' + QUOTENAME(name) + ' AS NVARCHAR(MAX)), '''', '''''') + ''''
    FROM sys.columns 
    WHERE object_id = OBJECT_ID(@TableName)
    AND is_identity = 0
    ORDER BY column_id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N');' + CHAR(13)
FROM sys.tables WHERE name = @TableName

-- 拼接筛选条件生成最终语句
SET @SQL = N'SELECT N''' + @DeleteSQL + N''' + (SELECT ' + QUOTENAME(@SQL, '''') + N' FROM ' + QUOTENAME(@TableName) + N' WHERE ' + @FilterCondition + N' FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)'')'
EXEC sp_executesql @SQL

若不需要先删除原有记录,仅导出筛选后的INSERT语句,将@DeleteSQL变量赋值为空字符串即可。

2. 批量多表导出脚本

针对数十张表频繁更新的需求,可通过临时配置表批量生成所有表的更新脚本,仅需修改配置部分即可一键生成全量更新脚本:

-- 创建临时配置表,用完自动销毁,也可改成永久表留作后续使用
CREATE TABLE #ExportConfig (
    TableName NVARCHAR(128),
    FilterCondition NVARCHAR(MAX), -- 全量导出填NULL即可
    NeedDelete BIT -- 1=导出前先删除符合条件的记录,0=仅导出INSERT语句
)

-- ****************** 仅修改此处配置即可 ******************
INSERT INTO #ExportConfig VALUES
(N'全量导出表1', NULL, 0),
(N'全量导出表2', NULL, 0),
(N'管控配置表', N'Category = ''System'' AND Collection_Name = ''Status''', 1)
-- ********************************************************

-- 批量生成所有脚本
DECLARE @FinalScript NVARCHAR(MAX) = N''
DECLARE @TableName NVARCHAR(128), @Filter NVARCHAR(MAX), @NeedDel BIT
DECLARE cur CURSOR FOR SELECT TableName, FilterCondition, NeedDelete FROM #ExportConfig
OPEN cur
FETCH NEXT FROM cur INTO @TableName, @Filter, @NeedDel

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @SQL NVARCHAR(MAX) = N''
    DECLARE @DelSQL NVARCHAR(MAX) = N''
    IF @NeedDel = 1 AND @Filter IS NOT NULL
    BEGIN
        SET @DelSQL = N'DELETE FROM ' + QUOTENAME(@TableName) + N' WHERE ' + @Filter + N';' + CHAR(13) + CHAR(13)
    END

    SELECT @SQL = @SQL + N'INSERT INTO ' + QUOTENAME(@TableName) + N' (' + STUFF((
        SELECT N', ' + QUOTENAME(name) 
        FROM sys.columns 
        WHERE object_id = OBJECT_ID(@TableName)
        AND is_identity = 0
        ORDER BY column_id
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N') VALUES (' + STUFF((
        SELECT N', N''' + REPLACE(CAST(' + QUOTENAME(name) + ' AS NVARCHAR(MAX)), '''', '''''') + ''''
        FROM sys.columns 
        WHERE object_id = OBJECT_ID(@TableName)
        AND is_identity = 0
        ORDER BY column_id
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, N'') + N');' + CHAR(13)
    FROM sys.tables WHERE name = @TableName

    DECLARE @TableScript NVARCHAR(MAX)
    SET @SQL = N'SELECT @Out = N''' + @DelSQL + N''' + (SELECT ' + QUOTENAME(@SQL, '''') + N' FROM ' + QUOTENAME(@TableName) + ISNULL(N' WHERE ' + @Filter, N'') + N' FOR XML PATH(''''), TYPE).value(''.'', ''NVARCHAR(MAX)'')'
    EXEC sp_executesql @SQL, N'@Out NVARCHAR(MAX) OUT', @Out = @TableScript OUT

    SET @FinalScript += N'-- 处理表:' + @TableName + CHAR(13) + @TableScript + CHAR(13) + N'GO' + CHAR(13) + CHAR(13)
    FETCH NEXT FROM cur INTO @TableName, @Filter, @NeedDel
END

CLOSE cur
DEALLOCATE cur

-- 输出生成的完整更新脚本
SELECT @FinalScript AS FullExportScript

如果表包含二进制、XML等特殊类型字段,可针对性调整字段拼接部分的转换逻辑,默认逻辑适配字符串、数字、日期等绝大多数常见数据类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:45:03