I need to transfer data from one table to the same table in another server which has been truncated. What is the easiest way to do this?
Use the SQL Server Import and Export wizard. It's probably the easiest way to accomplish this task.
For more advanced data transfer, consider using bcp
utility, BULK INSERT
statement and OPENDATASOURCE
.
Setup linked servers and then use the following on the destination database:
INSERT INTO existingTable (col1,col2..)
SELECT col1,col2...
FROM linkedserver.dbo.database.othertable
This is the script I like to use for this. Easy to use, and is mostly bug-free. Just copy the text below into your query window, and follow the directions. After you run it you will have a bunch of insert statements that you can run on the other server.
/*
Use this script to create insert statements for each row in the specified table.
Instructions:
1. Set the database you want to script from as normal.
2. change the set @TableName = '<YourTableName>' line to be the
table you want to script out.
3. Run the script and copy all the text from the results below
the line with all the dashes (----).
Notes:
If you get the error message "Invalid object name '<YourTableName>'."
then you either forgot to set the correct database or you spelled
your table name wrong
Credits:
Bob Wiechman - Fix for smalldatetime support
Richard Lesh - correct support of uniqueidentifiers, automatic
setting of Identity off/on, add Where clause support, more detail in
debug mode.
*/
declare @TableName sysname
declare @WhereClause varchar(1024)
declare @IdentityInsert int
declare @ColName sysname
declare @ColType tinyint
declare @ColStatus tinyint
declare @DebugMode bit
declare @ColList nvarchar(4000)
declare @ValList nvarchar(4000)
declare @SQL1 nvarchar(1000)
declare @SQL2 nchar(10)
declare @SQL3 nchar(1000)
set @TableName = '<YourTableName>' -- '<YourTableName>'
set @WhereClause = '' -- limit scope of inserts
set @DebugMode = 0 -- set to 1 if you only want a script
set @IdentityInsert = 0 -- set to 1 if you want to force IDENTITY_INSERT statements
set @ColList = ''
set @ValList = ''
set @SQL1 = 'select replace(''insert into ' + @TableName + ' ('
set @SQL2 = ') values ('
set @SQL3 = ')'', ''''''null'''''', ''null'') from ' + @TableName
if @DebugMode = 1 print '-- StmtShell: ' + @sql1 + @sql2 + @sql3
declare csrColumns cursor local fast_forward for
select c.name, c.xtype, c.status
from syscolumns c
inner join sysobjects o
on o.id = c.id
where o.name = @TableName
and o.xtype in ('U', 'S')
order by ColID
open csrColumns
fetch next from csrColumns into @ColName, @ColType, @ColStatus
while @@fetch_status = 0
begin
set @ColList = @ColList + ' ' + @ColName
if @ColType in (173, 104, 106, 62, 56, 60, 108, 59, 52, 122, 48, 165) -- numeric types (nulls not supported yet)
set @ValList = @ValList + ' ''+convert(varchar(200),' + @ColName + ')+'''
else if @ColType in (175, 239, 231, 231, 167) -- uid and string types
set @ValList = @ValList + ' ''''''+isnull(' + @ColName + ',''null'')+'''''''
else if @ColType in (58, 61) -- dates (nulls not supported yet)
set @ValList = @ValList + ' ''''''+convert(varchar(200),' + @ColName + ')+'''''''
else if @ColType = 36 -- uniqueidentfiers (nulls not supported yet)
set @ValList = @ValList + ' ''''{''+convert(varchar(200),' + @ColName + ')+''}'''''
if @DebugMode = 1 begin print '-- @ValList: ' + rtrim(@ValList) end
if (@ColStatus & 0x80) = 0x80 begin set @IdentityInsert = 1 end -- Check if column has Identity attribute
fetch next from csrColumns into @ColName, @ColType, @ColStatus
end
close csrColumns
deallocate csrColumns
set @ColList = replace(ltrim(@ColList), ' ', ', ')
set @ValList = replace(ltrim(@ValList), ' ', ', ')
if @IdentityInsert = 1
print 'set identity_insert ' + @TableName + ' on'
if @DebugMode = 1
print @SQL1 + @ColList + @SQL2 + @ValList + @SQL3 + ' ' + @WhereClause
else
exec (@SQL1 + @ColList + @SQL2 + @ValList + @SQL3 + ' ' + @WhereClause)
if @IdentityInsert = 1
print 'set identity_insert ' + @TableName + ' off'
Back up the table on the one server, to a file, and restore that file into the empty table on the other one...
Depending on the amount and frequency of your data transfer. It it's a low volume one time process, you're better off with using T-SQL to directly insert the data. This can be done either through linked servers or OPENQUERY clause.
If its high volume one time process, use SSIS or BCP utility.
If its high volume high frequency, use replication.
I would use Data Transformation Services (aka Integration Services).