如何批量导出主键的创建脚本

houyichong 2011-12-28 06:22:57
批量(部分迁移)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数据类型,字段名太多,不好使用游标循环


...全文
172 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2011-12-30
  • 打赏
  • 举报
回复
用游标,嵌套7楼的代码即可.

declare ap scroll cursor for
select name from sysobjects where xtype='U' and name like 'uld%'

declare @tab varchar(200),@sql varchar(5000)

open ap
fetch first from ap into @tab
while(@@FETCH_STATUS<>-1)
begin
select @sql='alter table ['+@tab+'] add constraint ['
+name+'] '
from sys.objects
where parent_object_id=object_id(@tab) and [type]='PK'

select @sql=@sql+' primary key('+
(select cast(
(select name+','
from (select distinct 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

fetch next from ap into @tab
end

close ap
deallocate ap
houyichong 2011-12-29
  • 打赏
  • 举报
回复
我有一批表,表明都是uld开头的,早知道给你写一个循环出来了
唐诗三百首 2011-12-29
  • 打赏
  • 举报
回复

-- 建测试表
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)
houyichong 2011-12-29
  • 打赏
  • 举报
回复
如果有办法能够批量生成如下的原来的主键脚本就可以很好的解决上面的问题
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

你们见到过能这样批量导出脚本的么?这个在2008版本中可以单个约束的导出,但是不知道如何能做到批量处理
houyichong 2011-12-29
  • 打赏
  • 举报
回复
所以还原的方法是行不通的
houyichong 2011-12-29
  • 打赏
  • 举报
回复
需要的数据表有200多个,
其他觉得部分的数据表已经在新建立的数据库中存在了,
这些表只需要结构在就可以了,而且已经处理好的,不需要另外处理。
就剩下那200多个数据表,数据和结构都需要,都有自动递增字段,字段数也多。
dovei 2011-12-28
  • 打赏
  • 举报
回复
导主键...不知道有啥方法
不知LZ要干嘛.如果只要数据库结构.不要数据 很好办
就如楼上所说 先复制.再删数据(写个循环很快就完了)
唐诗三百首 2011-12-28
  • 打赏
  • 举报
回复
这样可行但比较麻烦,

另一个方案: 直接把原库备份, 到目标服务器上恢复, 恢复完成后, 删除不需要的表即可.
-晴天 2011-12-28
  • 打赏
  • 举报
回复
导入导出,只能导数据,不能导约束的.
楼主说的,可能是在导出的时候可以选"启用标识",那只是向已有标识列的表中导的时候的一种选择.

导结构,导约束,还是得用脚本.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧