我在下面有这个查询,我从1个数据库中获取某些列,然后我将它们插入到另一个数据库中的另一个表中。然后我将删除我正在复制的表。目前,复制5300条记录需要5分36秒。有什么方法可以提高速度吗?
Declare @cursor cursor, @Firstname nchar(50), @MiddleInitial nchar(5),
@Surname nchar(50), @EmailAddress nchar(100), @DOB nchar(8), @Sex char(1), @altEmail nchar(100)
set @cursor = cursor for select Firstname, MiddleInitial, Surname, HomeEmailAddress,
DateOfBirth, Sex, WorkEmailAddress from cs_clients
open @cursor
fetch next from @cursor into @FirstName, @MiddleInitial, @Surname, @EmailAddress, @DOB, @Sex, @altEmail
while @@fetch_status = 0
begin
set nocount on
use hrwb_3_0
declare @Password nvarchar(100), @EncryptedText nvarchar(100)
exec L_Password_GetRandomPassword @Password output, @EncryptedText output
declare @userID nvarchar(100)
exec L_Password_GetRandomPassword @userID output, @EncryptedText output
set nocount off
set @EmailAddress = isnull(@EmailAddress, @altEmail)
insert into A_User values
('CS', 'CLUBSAIL', rtrim(@userID), rtrim(@Password), rtrim(@Surname), rtrim(@FirstName), rtrim(@MiddleInitial), 15, 'NA', 'NA', '', rtrim(@EmailAddress), rtrim(@DOB), 1, 0, 1, 0, '', rtrim(@Sex), '')
fetch next from @cursor into @FirstName, @MiddleInitial, @Surname, @EmailAddress, @DOB, @Sex, @altEmail
end
答案 0 :(得分:3)
这很慢,因为你一次只做一个。
请参阅此处了解一次执行多行的一些方法:http://blog.sqlauthority.com/2008/07/02/sql-server-2008-insert-multiple-records-using-one-insert-statement-use-of-row-constructor/
或者在本地数据库上创建一个临时表,然后使用它来一次插入所有内容(即在一个语句中)。
答案 1 :(得分:1)
如果您经常执行此类数据库进行数据库传输,则应该查看DTS或SSIS(具体取决于您使用的SQL Server版本)。这两种技术都专门用于在不同的源和目的地之间提取,转换和加载数据。
答案 2 :(得分:1)
如果你只需要在具有相同结构的表之间复制数据,这应该有效:
INSERT INTO Database2.dbo.Table2 SELECT * FROM Database1.dbo.Table1
如果您还需要转换数据(如您的示例所示),您可能会也可能无法在单个语句中执行此操作,具体取决于转换的复杂程度。