SQL Server系统版本表数据脚本插入报错,求非Excel处理方案
解决SQL Server系统版本表导出脚本插入错误的方法
方法1:从SSMS生成脚本时直接排除GENERATED ALWAYS列
重新执行「生成脚本」向导,在**「设置脚本选项」的高级设置中找到「脚本系统版本化表的生成始终列」**,将其设置为False。生成的INSERT语句会自动忽略StartTime、EndTime这类由系统维护的列,直接在目标库执行即可,无需后续修改。
方法2:用正则表达式批量修改已生成的脚本
如果已经生成了包含问题列的脚本,用支持正则替换的文本编辑器(如VS Code、Notepad++)批量处理:
- 移除列列表中的目标列:
正则表达式:(\[StartTime\],\s*\[EndTime\]|\[EndTime\],\s*\[StartTime\])
替换为空字符串,可匹配列的不同排列顺序。 - 移除值列表中对应的时间值:
正则表达式:('(\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
相关产品推荐
相关产品推荐

