我是对SSIS完全不满意的人。
当源表没有标识列时
- 在目标服务器上创建一个空数据库
- 在目标服务器上创建到源服务器的链接服务器
- 在源数据库上运行以下脚本以生成select * into ...语句
- 从目标数据库运行生成的脚本
- 源数据库中的脚本主键,索引,触发器,函数和过程
- 通过生成的脚本创建这些对象
现在,T-SQL生成Select * into ...语句
SET NOCOUNT ON
declare @name sysname
declare @sql varchar(255)
declare db_cursor cursor for
select name from sys.tables order by 1
open db_cursor
fetch next from db_cursor into @name
while @@FETCH_STATUS = 0
begin
Set @sql = 'select * into [' + @name + '] from [linked_server].[source_db].[dbo].[' + @name + '];'
print @sql
fetch next from db_cursor into @name
end
close db_cursor
deallocate db_cursor
这为每个表生成一行以进行复制,例如
select * into [Table1] from [linked_server].[source_db].[dbo].[Table1];
如果表包含标识列,我将编写脚本,包括标识属性和主键。
在这种情况下,我不使用链接服务器插入...选择...,因为这不是批量技术。我正在处理一些类似于[此问题1的 PowerShell脚本,但是我仍在进行错误处理。真正的大表可能会导致内存不足错误,因为整个表在通过SQLBulkCopy发送到数据库之前已加载到内存中。
索引等的增加与上述情况类似。这次,我可以跳过重新创建主键的操作。