Fanr

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
“tablediff ”命令行工具

  “tablediff ”工具支持你比较两个表的内容。它原先开发出来是为了复制场景,来帮助诊断差异的,但是它对其它情况也非常有用。当两个表的数据可能相同或者相似时,该工具可以帮助判断它们是否相同,而且如果它们是不同的,它可以识别表中的哪些数据是不同的。

  “tablediff”的语法如下:

  tablediff
  [ -? ] |
  {
  -sourceserver source_server_name[\instance_name]
  -sourcedatabase source_database
  -sourcetable source_table_name
  [ -sourceschema source_schema_name ]
  [ -sourcepassword source_password ]
  [ -sourceuser source_login ]
  [ -sourcelocked ]
  -destinationserver destination_server_name[\instance_name]
  -destinationdatabase subscription_database
  -destinationtable destination_table
  [ -destinationschema destination_schema_name ]
  [ -destinationpassword destination_password ]
  [ -destinationuser destination_login ]
  [ -destinationlocked ]
  [ -b large_object_bytes ]
  [ -bf number_of_statements ]
  [ -c ]
  [ -dt ]
  [ -et table_name ]
  [ -f [ file_name ] ]
  [ -o output_file_name ]
  [ -q ]
  [ -rc number_of_retries ]
  [ -ri retry_interval ]5
  [ -strict ]
  [ -t connection_timeouts ]
  }

  “tablediff”语法需要源和目标的连接信息来执行比较。这些信息包括将要比较的服务器,数据库和表信息。连接信息必须提供给SQL Server认证,但是如果Windows认证是可用的,则可以空着。源参数和目标参数可以是两个不同的服务器或者相同的服务器,“tablediff”工具可以运行在一台机器上,既不是源,也不是目标。

  为了说明该工具的作用,我们来看一个简单的比较示例,我们使用了“AdventureWorks2008R2”数据库。要创建比较用的数据,最简单的方法是把一个表中的内容查询复制到另一个表中,然后更新一个表的某些行内容。下面的“SELECT”语句对“AdventureWorks2008R2 ”数据库中的“AddressType”表进行了复制,复制的新表是“AddressTypeCopy”:

  select *
  into Person.AddressTypeCopy
  from Person.AddressType

  此外,下面的语句更新了“AddressTypeCopy ”表中的两行(为测试用),这样你可以用“tablediff ”工具找出它们之间的差异:

  UPDATE Person.AddressTypeCopy
  SET Name = ‘Billing New’
  WHERE AddressTypeId = 1
  UPDATE Person.AddressTypeCopy
  SET Name = ‘Shipping New’,
  ModifiedDate = ‘20090918’
  WHERE AddressTypeId = 5

  “tablediff ”工具可以加上下面的参数执行,这样就可以识别“AddressType ”表和“AddressTypeCopy ”表之间的差异:

  tablediff -sourceserver “(local)” -sourcedatabase “AdventureWorks2008R2”
  -sourceschema “Person”-sourcetable “AddressType”
  -destinationserver “(local)” -destinationdatabase “AdventureWorks2008R2”
  -destinationschema “Person” -destinationtable “AddressTypeCopy”
  -f c:\TableDiff_Output.txt

  目标参数和源参数与前面的例子相同,除了表参数,也就是其中的源表“AddressType ”和目标表“AddressTypeCopy”。该工具使用这些参数执行会在命令行提示窗口中得到下面的输出内容:

  用户指定的代理参数值:

  -sourceserver (local)
  -sourcedatabase AdventureWorks2008R2
  -sourceschema Person
  -sourcetable AddressType
  -destinationserver (local)
  -destinationdatabase AdventureWorks2008R2
  -destinationschema Person
  -destinationtable AddressTypeCopy
  -f c:\TableDiff_Output
  Table [AdventureWorks2008R2].[Person].[AddressType] on (local)
  and Table [AdventureWorks2008R2].[Person].[AddressTypeCopy] on (local)
  have 2 differences.
  Fix SQL written to c:\TableDiff_Output.sql.
  Err AddressTypeID Col
  Mismatch 1 Name
  Mismatch 5 ModifiedDate Name
  The requested operation took 0.296875 seconds.

  输出内容中首先显示的是所采用参数的摘要,然后显示了比较结果。在这个例子中,它找到了两处差异,因为我们前面更新了“AddressTypeCopy”表。此外,本例中使用“-f”参数使得“tablediff”工具输出了可以用来修正目标表中差异的SQL文件。本例中该输出文件的内容如下:

  — Host: (local)
  — Database: [AdventureWorks2008R2]
  — Table: [Person].[AddressTypeCopy]
  SET IDENTITY_INSERT [Person].[AddressTypeCopy] ON
  UPDATE [Person].[AddressTypeCopy]
  SET [Name]=’Billing’
  WHERE [AddressTypeID] = 1
  UPDATE [Person].[AddressTypeCopy]
  SET [ModifiedDate]=’2002-06-01 00:00:00.000’,
  [Name]=’Shipping’ WHERE [AddressTypeID] = 5
  SET IDENTITY_INSERT [Person].[AddressTypeCopy] OFF

  要记住,我们可以用“tablediff”工具实现几种不同的比较类型。“-q”参数会触发快速比较,只比较记录数量并查找对象的差异。“-strict”参数在比较运行时会强制要求每个表的结构是相同的。如果没有使用该参数,该工具允许一些列有不同的数据类型,只要他们满足数据类型自动映射的需求就行(例如,INT可以与BIGINT相比较)。

  “tablediff”工具可以用在许多种不同类型的比较上。你如何使用这一工具取决于几个因素,包括你要比较的数据数量和类型。

posted on 2011-03-19 21:41  Fanr_Zh  阅读(573)  评论(0编辑  收藏  举报