SqlServer迁移基础 --生成所迁移数据库所有表的tablediff脚本

https://docs.microsoft.com/zh-cn/sql/tools/tablediff-utility
https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/administration/compare-replicated-tables-for-differences-replication-programming
tablediff 实用工具用于比较两个非收敛表中的数据,它对于排除复制拓扑中的非收敛故障非常有用。
借助SQLSERVER自带的tablediff工具,当初微软制作这个工具的目的就是用于比较复制中发布表和订阅表的数据一致

tablediff工具所在目录
C:\Program Files\Microsoft SQL Server\100\COM\tablediff.exe

C:\Program Files\Microsoft SQL Server\110\COM\tablediff.exe

C:\Program Files\Microsoft SQL Server\120\COM\tablediff.exe

USE AdventureWorks2012
GO

-- declare public variables, need to init by user
DECLARE @source_Instance sysname,
        @source_Database sysname,
        @source_User sysname,
        @source_Passwd sysname,
        @destination_Instance sysname,
        @destination_Database sysname,
        @destination_User sysname,
        @destination_Passwd sysname,
        @diff_table_list NVARCHAR(MAX);

-- Public variables init.
SELECT @source_Instance = 'localhost',   -- Source Instance Name
       @source_Database = 'AdventureWorks2012',       -- Source Database is current database.
       @source_User = 'sa',                             -- Source Instance Connect User Name
       @source_Passwd = N'123456',                    -- Source Instance User Password
       @destination_Instance = N'127.0.0.1,2433',       -- Destination Instance Name
       @destination_Database = N'AdventureWorks2012', -- Destination Database name: NULL/empty: Keep the same as source db
       @destination_User = 'sa',                        -- Destination Instance User Name
       @destination_Passwd = N'123456',                -- Destination Instance User Password
       @diff_table_list = N''                     --NULL/empty: ALL Tables are needed to be diff.
;

-- Private variables, there is no need to init.
DECLARE @diff_table_list_xml XML,
        @timestamp CHAR(14);

-- correct the variables init by user.
SELECT @source_Instance = RTRIM(LTRIM(@source_Instance)),
       @source_Database = RTRIM(LTRIM(@source_Database)),
       @source_User = RTRIM(LTRIM(@source_User)),
       @source_Passwd = RTRIM(LTRIM(@source_Passwd)),
       @destination_Instance = RTRIM(LTRIM(@destination_Instance)),
       @destination_Database = CASE
                                   WHEN ISNULL(@destination_Database, N'') = N'' THEN
                                       @source_Database
                                   ELSE
                                       @destination_Database
                               END,
       @destination_User = RTRIM(LTRIM(@destination_User)),
       @destination_Passwd = RTRIM(LTRIM(@destination_Passwd)),
       @diff_table_list_xml
           = '<V><![CDATA['
             + REPLACE(
                          REPLACE(
                                     REPLACE(@diff_table_list, CHAR(10), ']]></V><V><![CDATA['),
                                     ',',
                                     ']]></V><V><![CDATA['
                                 ),
                          CHAR(13),
                          ']]></V><V><![CDATA['
                      ) + ']]></V>',
       @timestamp = REPLACE(REPLACE(REPLACE(CONVERT(CHAR(19), GETDATE(), 120), N'-', ''), N':', N''), CHAR(32), N'');

IF OBJECT_ID('tempdb..#tb_list', 'U') IS NOT NULL
DROP TABLE #tb_list;
CREATE TABLE #tb_list
(
    RowId INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
    TableName sysname NOT NULL
);

IF ISNULL(@diff_table_list, '') = ''
BEGIN
    INSERT INTO #tb_list
    SELECT name
    FROM sys.tables AS tb
    WHERE tb.is_ms_shipped = 0;
END;
ELSE
BEGIN
    INSERT INTO #tb_list
    SELECT table_name = T.C.value('(./text())[1]', 'sysname')
    FROM @diff_table_list_xml.nodes('./V') AS T(C)
    WHERE T.C.value('(./text())[1]', 'sysname') IS NOT NULL;
END;

SELECT 'tablediff.exe -sourceserver '+ @source_Instance+' -sourceuser '+@source_User+'  -sourcepassword '+ @source_Passwd+' -sourcedatabase ' +@source_Database+' -sourceschema '+sch.name+' -sourcetable '+ tb.name+' -destinationserver '+ @destination_Instance+' -destinationuser '+@destination_User+' -destinationpassword '+@destination_Passwd+' -destinationdatabase '+@destination_Database+' -destinationschema '+sch.name+' -destinationtable '+ tb.name+' -c -o '+@source_Database+'_TableDiff_'+ @timestamp + N'.txt'
AS table_diff
FROM sys.tables AS tb
    LEFT JOIN sys.schemas AS sch
        ON tb.schema_id = sch.schema_id
WHERE tb.is_ms_shipped = 0
      AND tb.name IN (
                         SELECT TableName COLLATE Chinese_PRC_CI_AS FROM #tb_list
                     );

DROP TABLE #tb_list;

保存执行结果中table_diff列所有内容到文件table_diff.bat
执行table_diff.bat文件
检查table_diff.bat执行的日志文件

table_diff.bat批处理文件执行后会生成一个日志文件,日志文件的命名格式是:DatabaseName_TableDiff_YYYYMMDDHHMMSS.txt,比如:AdventureWorks2012_TableDiff_20171122230836.txt

时间: 2024-12-02 11:10:06

SqlServer迁移基础 --生成所迁移数据库所有表的tablediff脚本的相关文章

SqlServer迁移基础 --生成所迁移数据库所有表的BCP脚本

bcp 实用工具https://docs.microsoft.com/zh-cn/sql/tools/bcp-utility 在SSMS配合BCP迁移SQL Server数据库上阿里云博文基础完善 改动的地方如下 1:tempdb数据库的排序规则与迁移数据库的排序规则不一致 2:如果表名不规范的情况需要添加>[] >处理 USE AdventureWorks2012; GO -- declare public variables, need to init by user DECLARE @s

SQL Server如何查看所有数据库所有表大小信息

一.背景 之前写了篇关于:SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database)的文章,它罗列出某个数据所有表的信息,这些信息包括:表的记录数.数据记录占用空间.索引占用空间.没使用的空间等(如Figure1所示),现在我来讲述如何获取整个数据库实例中所有数据库所有表的信息(如Figure2所示). (Figure1:某数据库所有表信息) (Figure2:所有数据库所有表信息) 二.实现方法 下面内容讲述了在实现Fig

yii2.0数据库迁移教程【多个数据库同时同步数据】_php实例

本文讲述了yii2.0数据库迁移的方法.分享给大家供大家参考,具体如下: 创建迁移 使用如下命令来创建一个新的迁移: yii migrate/create <name> 必填参数 name 的作用是对新的迁移做一个简要的描述.例如,如果这个迁移是用来往多个数据库同一张表  ( 假设每个数据库都有news表 )   添加字段的,那么你可以使用addColumn_news (该名称自定义)这个名称并运行如下命令: yii migrate/create addColumn_news 注意:因为 na

yii2.0数据库迁移教程【多个数据库同时同步数据】

本文讲述了yii2.0数据库迁移的方法.分享给大家供大家参考,具体如下: 创建迁移 使用如下命令来创建一个新的迁移: yii migrate/create <name> 必填参数 name 的作用是对新的迁移做一个简要的描述.例如,如果这个迁移是用来往多个数据库同一张表  ( 假设每个数据库都有news表 )   添加字段的,那么你可以使用addColumn_news (该名称自定义)这个名称并运行如下命令: yii migrate/create addColumn_news 注意:因为 na

Oracle基础知识-数据迁移

我们常需要对Oracle数据库进行迁移,迁移到更加高级的主机上.迁移到远程的机房上.迁移到不同的平台下 一.exp/imp: 这也算是最常用最简单的方法了,一般是基于应用的owner级做导出导入. 操作方法为:在新库建立好owner和表空间,停老库的应用,在老库做 [sql] view plaincopyprint? exp user/pwd owner=XXX file=exp_xxx.dmp log=exp_xxx.log buffer=6000000 传dmp文件到新库,在新库做 [sql

数据库迁移-sqlite3数据库两个数据库文件表之间的复制

问题描述 sqlite3数据库两个数据库文件表之间的复制 sqlite3怎样将A数据库中Table1的数据复制到B数据库的Table1中 数据量很大 用C++实现 解决方案 程序取出数据,然后插入sql

云服务器 ECS 镜像迁移:应用迁云之镜像迁移-(4)迁移流程和实践方法

应用迁云之镜像迁移-(4)迁移流程和实践方法 迁移流程 1.镜像迁移可行性评估 当您选择镜像迁移前,需要对被迁移的服务器主机详细信息进行调研,并按照镜像迁移可行性评估小节中描述的要求及限制进行评估.评估是否可行及是否需要采用镜像迁移的方式来进行迁移. 如果被迁移服务器主机数量规模大.并且大多都带系统盘.网络条件不好,建议不要使用镜像迁移的方式.因为镜像文件都比较大,在此条件下进行镜像迁移反而会加大迁移的时间及人力成本. 如果被迁移服务器主机中应用配置比较复杂.无人维护.网络条件好,建议您使用镜像

应用迁云之镜像迁移-(4)迁移到阿里云实施流程和实践方法

镜像迁移到阿里云实施流程   1.       镜像迁移可行性评估 当我们选择镜像迁移前需要对被迁移的服务器主机详细信息进行调研按照镜像迁移可行性评估小节中描述的要求及限制进行评估评估是否可行.及是否需要采用镜像迁移的方式来进行迁移. 如果被迁移服务器主机数量规模大.并且大多都带系统盘.网络条件不好的情况建议不要使用镜像迁移方式因为往往镜像文件都比较大在此条件下进行镜像迁移反而会加大迁移的时间及人力成本. 如果被迁移服务器主机中应用配置比较复杂.无人维护.网络条件好我们建议使用镜像迁

《数据库技术原理与应用教程(第2版)》——第2章 数据库的基础知识 2.1 数据库中的基本概念

第2章 数据库的基础知识 本章将介绍数据库的基础知识,包括基本概念.基本结构.应用平台及特点等.本章内容十分重要,它对全书具有提纲挈领的作用. 2.1 数据库中的基本概念 1.数据 (1)数据的概念 数据(data)是现实世界中客体在计算机中的抽象表示.具体地说,它是一种计算机内的有限个数的一组符号表示. 由于数据是一种抽象的符号表示,因此它缺少语义,在必要时须对它作出语义解释. (2)数据的性质分类 1)数据的持久性:从存储时间看,数据一般分为两部分,其中一部分与程序仅有短时间的交互关系,随着