日期:2014-05-18  浏览次数:20459 次

如何批量导出主键的创建脚本
批量(部分迁移)sqlserver2008 数据表迁移
方案:
1.批量的数据表已经导入到另外的数据库中,
但是导入的数据表没有原来数据库中的主键、默认值

如何批量处理主键或默认值?(sql2000的导入导出向导中仿佛有这个选项的,sql2008莫非退步了??)

如果能够批量生成如下的原来的主键脚本就可以了

ALTER TABLE [dbo].[uld_packbak] ADD CONSTRAINT [PK_uld_packbak] PRIMARY KEY CLUSTERED 
(
[bakid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO(尝试过跟踪客户端的企业管理器,看看Create到 [文件]是不是会执行一些系统存储过程来生成的,估计是BCP跟不到)

2.创建数据库脚本,在新数据库执行后,有表结构,主键,默认值
但是没有数据,用SQL脚本插入很麻烦,因为每表都有自动Int数据类型,字段名太多,不好使用游标循环




------解决方案--------------------
SQL code

-- 建测试表
create table houyichong
(id1 int not null,
 id2 int not null,
 de varchar(10)
 constraint pk_houyichong primary key(id1,id2)
 )

-- 动态产生脚本
declare @tab varchar(200),@sql varchar(5000)

select @tab='houyichong'

select @sql='alter table ['+@tab+'] add constraint ['
+name+'] '
from sys.objects
where parent_object_id=object_id('houyichong')

select @sql=@sql+' primary key('+
(select cast(
(select name+','
from (select c.name
from sys.indexes a
inner join sys.index_columns b
on a.[object_id]=b.[object_id]
inner join sys.columns c
on b.[object_id]=c.[object_id]
and b.index_column_id=c.column_id
where a.[object_id]=object_id(@tab)
and a.is_primary_key=1) t
for xml path('')) as varchar(20)))

select @sql=left(@sql,len(@sql)-1)+') '

-- 打印
print @sql

--> 结果
alter table [houyichong] add constraint [pk_houyichong]  primary key(id1,id2) 

-- 执行
exec(@sql)