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

SQL Server系统版本表数据脚本插入报错,求非Excel处理方案

解决SQL Server系统版本表导出脚本插入错误的方法

方法1:从SSMS生成脚本时直接排除GENERATED ALWAYS列

重新执行「生成脚本」向导,在**「设置脚本选项」的高级设置中找到「脚本系统版本化表的生成始终列」**,将其设置为False。生成的INSERT语句会自动忽略StartTime、EndTime这类由系统维护的列,直接在目标库执行即可,无需后续修改。

方法2:用正则表达式批量修改已生成的脚本

如果已经生成了包含问题列的脚本,用支持正则替换的文本编辑器(如VS Code、Notepad++)批量处理:

  1. 移除列列表中的目标列:
    正则表达式:(\[StartTime\],\s*\[EndTime\]|\[EndTime\],\s*\[StartTime\])
    替换为空字符串,可匹配列的不同排列顺序。
  2. 移除值列表中对应的时间值:
    正则表达式:('(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})',\s*'(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})')
    替换为空字符串,该正则匹配SQL Server默认的系统版本时间格式,确保只替换StartTime和EndTime对应的成对值,不会影响其他DateTime列。

方法3:用动态SQL生成正确的INSERT语句

在源数据库中执行动态SQL,自动生成不含目标列的插入脚本:

-- 遍历所有系统版本表并生成INSERT语句
DECLARE @Tables TABLE (TableName NVARCHAR(128));
INSERT INTO @Tables
SELECT name FROM sys.tables WHERE is_system_versioned = 1;

DECLARE @TableName NVARCHAR(128), @Columns NVARCHAR(MAX), @SQL NVARCHAR(MAX);
WHILE EXISTS(SELECT 1 FROM @Tables)
BEGIN
    SELECT TOP 1 @TableName = TableName FROM @Tables;
    
    -- 获取排除StartTime、EndTime后的列名
    SELECT @Columns = STRING_AGG(QUOTENAME(c.name), ', ')
    FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE t.name = @TableName AND c.name NOT IN ('StartTime', 'EndTime');
    
    -- 生成INSERT语句的动态SQL
    SET @SQL = 'SELECT ''INSERT INTO ' + QUOTENAME(@TableName) + ' (' + @Columns + ') VALUES ('' + ' +
               STRING_AGG('CASE WHEN ' + QUOTENAME(c.name) + ' IS NULL THEN ''NULL'' ELSE QUOTENAME(' + QUOTENAME(c.name) + ', '''''') END', ' + '', '' + ') +
               + '';'') FROM ' + QUOTENAME(@TableName);
    
    EXEC sp_executesql @SQL;
    
    DELETE FROM @Tables WHERE TableName = @TableName;
END

执行后将输出结果复制为脚本,直接在目标库运行即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:20:30