本帖最后由 Cherish_j_wang 于 2012-3-14 21:17 编辑
之利用tablediff生成Insert语句 背景MSSQL DBA有时候需要将某个表的数据来生成Insert语句。在MSSQL SSMS中没有提供这个直接生成INSERT脚本的方法(当然我们可以使用SMO来自己写),本文是使用Replication修复工具tablediff来完成这个工作。 PS:其实论坛中也有人问到这个问题,本次就在这里将其解决吧。帖子地址如下:
方法Step1.设置环境变量:如果你已经设置好了,请跳过这个步骤 在Windows的Path路径中添加下面的地址(针对MSSQL 2008):C:\Program Files\Microsoft SQL Server\100\COM。 如果没有设置path环境变量或者设置错误,在使用tablediff的时候,会报告下面的错误: 'tablediff'is not recognized as an internal or external command,operable program or batchfile.
Step2.创建测试表并插入数据 - use test
- go
- --creating test table
- if OBJECT_ID('dbo.test_tablediff1','u') is not null
- drop table dbo.test_tablediff1
- go
- create table dbo.test_tablediff1
- (
- id int not null primary key
- ,name varchar(20) not null
- );
- --data init.
- insert into dbo.test_tablediff1
- select 1,'AA'
- UNION ALL
- select 2,'BB'
- ;
- go
复制代码
Step3.创建与测试表结构相同的空表 - select top 1 *
- into dbo.test_tablediff1_bak
- from dbo.test_tablediff1
- where 1 = 2
复制代码
Step4.构造tablediff批处理文件
例如将bat文件放到D:\temp\ tablediff_test.bat,内容如下: - tablediff /sourceserver "LCMIS005" /sourcedatabase "test" /sourceschema "dbo" /sourcetable "test_tablediff1" /sourceuser "sa" /sourcepassword "1qazxsw2!@#" /destinationserver "LCMIS005" /destinationdatabase "test" /destinationschema "dbo" /destinationtable "test_tablediff1_bak" /destinationuser "sa" /destinationpassword "1qazxsw2!@#" /bf "3000" /f "LCMIS005_test_dbo.test_tablediff1.sql" /t "6000"
复制代码
Step5.执行批处理文件 双击该批处理文件,直接执行就行了 批处理执行完毕,会有类似如下的提示: Table[test].[dbo].[test_tablediff1] on LCMIS005 and Table [test].[dbo].[test_tablediff1_bak]on LCMIS005 have 2 differences. Fix SQL written toLCMIS005_test_dbo.test_tablediff1.0.sql. Err id Col Src. Only 1 Src. Only 2 The requested operation took0.1200069 seconds.
Step6.查看生成的.sql文件 执行批处理后,生成的文件为D:\temp\ LCMIS005_test_dbo.test_tablediff1.0.sql。内容如下: - -- Host: LCMIS005
- -- Database: [test]
- -- Table: [dbo].[test_tablediff1_bak]
- INSERT INTO [dbo].[test_tablediff1_bak] ([id],[name]) VALUES (1,N'AA')
- INSERT INTO [dbo].[test_tablediff1_bak] ([id],[name]) VALUES (2,N'BB')
复制代码
Step7.替换生成的sql文件中的表名称 这个使用SSMS的查找替换功能(ctrl+H),将[test_tablediff1_bak]替换为[test_tablediff1],保存即可: - -- Host: LCMIS005
- -- Database: [test]
- -- Table: [dbo].[test_tablediff1]
- INSERT INTO [dbo].[test_tablediff1] ([id],[name]) VALUES (1,N'AA')
- INSERT INTO [dbo].[test_tablediff1] ([id],[name]) VALUES (2,N'BB')
复制代码
说明
1. 请大家思考,如果我们需要生成满足某个条件的INSERT语句,怎么采用类似的方法处理呢?比如:请生成满足下面语句条件的INSERT语句 - select *
- from dbo.test_tablediff1
- where id = 1;
复制代码
2. 如果测试表结构稍微做如下修改,我们的tablediff方法是否凑效?- if OBJECT_ID('dbo.test_tablediff1','u') is not null
- drop table dbo.test_tablediff1
- go
- create table dbo.test_tablediff1
- (
- id int not null primary key
- ,[newid] uniqueidentifier not null
- constraint df_newid default(newid())
- ,name varchar(20) not null
- ,[desc] nvarchar(max) null
- );
- insert into dbo.test_tablediff1
- select 1,NEWID(),'AA','Just for testing'
- union all
- select 2,NEWID(),'BB','Just for testing'
- ;
- go
复制代码 |