Sql 将特定数据从一台服务器传输到另一台服务器

Sql 将特定数据从一台服务器传输到另一台服务器,sql,sql-server,tsql,transfer,Sql,Sql Server,Tsql,Transfer,我有两个不同的sql Server(两个不同的数据库)。 这两台服务器具有相同的表。 现在,我只想将ID介于1.000和50.000之间的记录从服务器1的Person表传输到服务器2的Person表。 我怎么能用最简单的方法来做呢 尝试使用生成脚本,但没有选择这些ID的选项,脚本将传输所有记录。 尝试在服务器1上使用SELECT语句并将数据导出为CSV,然后在服务器2上导入CSV文件,但显然存在一些问题,因为datetimeoffset字段…我遇到了相同的问题,在两个域中的数据无法通过网络看到,

我有两个不同的sql Server(两个不同的数据库)。 这两台服务器具有相同的表。 现在,我只想将ID介于1.000和50.000之间的记录从服务器1的Person表传输到服务器2的Person表。 我怎么能用最简单的方法来做呢

尝试使用生成脚本,但没有选择这些ID的选项,脚本将传输所有记录。
尝试在服务器1上使用SELECT语句并将数据导出为CSV,然后在服务器2上导入CSV文件,但显然存在一些问题,因为datetimeoffset字段…

我遇到了相同的问题,在两个域中的数据无法通过网络看到,我必须获取一些日期,不是所有的数据,而是将其移动到“其他”服务器

我编写了一个脚本,从一个文件组中获取所有数据,并创建该数据的转储以及加载数据的脚本

不久之后,他们还开始将数据转储到存档中,以保存需要保留的数据,因为“csv”版本始终可以恢复,无论从现在起“7年”使用的数据库是什么

无论如何,这只是一个大的“打印”语句,它使用BCP在服务器之间移动大量数据。您可以调整它来做您喜欢的事情,只需稍微更改查询,文件顶部包含“控制”变量

/*******************************************************************
this script will generate thebcp out commands for all data from the 
users current connected database. The this script will only work if
both databases have the same ddl version, meaning same tables, same
columns same data definitions.
*******************************************************************/




SET NOCOUNT ON 
GO 
DECLARE  @Path                  nvarchar(2000)  = 'f:\export\'  -- storage location for bcp dump (needs to have lots of space!)
       , @Batchsize             nvarchar(40)    = '1000000'     -- COMMIT EVERY n RECORDS 
       , @Xmlformat             bit             = 0             -- 1 for yes to xml format, 0 for not xml
       , @SourceServerinstance  nvarchar(200)   = 'localhost'-- SQL Server \ Instance name 
       , @Security              nvarchar(800)   = ' -T '        -- options are -T (trusted), -Uloginid -Ploginpassword  
       , @GenerateDump          bit             = 0             -- 0 for storing data to disk, not 1 for loading from disk
       , @FileGroup             sysname         = 'Data';       -- Table filegroup that we are intrested in

--> set output to text and execute the query, then copy the generated commands, validate and execucte them                   
--------------------------------Do not edit below this line-----------------------------------------------------------------
DECLARE @filter TABLE(TABLE_NAME sysname)  
INSERT INTO @filter (TABLE_NAME)
SELECT o.name
  FROM sys.indexes as i 
  JOIN sys.objects as o on o.object_id = i.object_id
 WHERE i.data_space_id = FILEGROUP_ID(@FileGroup) 
   AND i.type_desc ='CLUSTERED'   
   and o.name not like 'sys%'   
 order by 1      

if(@GenerateDump=0)
begin

    --BCP-OUT TABLES 
    SELECT  'bcp "' + QUOTENAME( TABLE_CATALOG ) + '.' + QUOTENAME( TABLE_SCHEMA ) 
    + '.' + QUOTENAME( TABLE_NAME ) + '" out "' + @path + '' + TABLE_NAME + '.dat" -q -b"' 
    + @batchsize + '" -e"' + @path + 'Error_' + TABLE_NAME + '.err" -n -CRAW -o"' + @path + '' 
    + TABLE_NAME + '.out"  -S"' + @SourceServerinstance + '" ' + @security + '' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    if(@Xmlformat=0)
        begin
            print 'REM CREATE NON-XML FORMAT FILE '
            SELECT  'bcp "' + QUOTENAME( TABLE_CATALOG ) + '.' + QUOTENAME( TABLE_SCHEMA ) + '.'+ 
             QUOTENAME( TABLE_NAME ) + '" format nul -n -CRAW -f "' + @path + '' 
            + TABLE_NAME + '.fmt"  -S"' + @SourceServerinstance + '" ' + @security + '' 
            FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'  AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)
        end
    else
        begin
            PRINT 'REM XML FORMAT FILE' 
            SELECT  'bcp "' +QUOTENAME( TABLE_CATALOG ) + '.' + QUOTENAME( TABLE_SCHEMA ) 
            + '.' + QUOTENAME( TABLE_NAME ) + '" format nul -x -n -CRAW -f "' 
            + @path + '' + TABLE_NAME + '.xml"  -S"' + @SourceServerinstance + '" ' + @security + '' 
            FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'  AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter) 
        end
end
else
begin
    print '--Make sure you backup your database first'
    --GENERATE CONSTRAINT NO CHECK 
    PRINT '--NO CHECK CONSTRAINTS' 
    SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME( TABLE_NAME ) + ' NOCHECK CONSTRAINT ' +  QUOTENAME( CONSTRAINT_NAME ) 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    PRINT '--DISABLE TRIGGERS' 
    SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME( TABLE_NAME ) + ' DISABLE TRIGGER ALL' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)
    --TRUNCATE TABLE 
    SELECT 'TRUNCATE TABLE ' +QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME( TABLE_NAME ) + ' 
    GO ' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    --BULK INSERT 
    SELECT DISTINCT 'BULK INSERT ' + QUOTENAME(TABLE_CATALOG) + '.' 
    + QUOTENAME( TABLE_SCHEMA ) + '.' + QUOTENAME( TABLE_NAME ) + ' 
    FROM ''' + @path + '' + TABLE_NAME + '.Dat'' 
    WITH (FORMATFILE = ''' + @path + '' + TABLE_NAME + '.FMT'', 
    BATCHSIZE = ' + @batchsize + ', 
    ERRORFILE = ''' + @path + 'BI_' + TABLE_NAME + '.ERR'',         
    TABLOCK); 
    GO ' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    --GENERATE CONSTRAINT CHECK CONSTRAINT TO VERIFY DATA AFTER LOAD 
    PRINT '--CHECK CONSTRAINT' 


    SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA)+'.'+QUOTENAME( TABLE_NAME ) + ' CHECK CONSTRAINT ' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    SELECT 'ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA)+'.'+ QUOTENAME( TABLE_NAME ) + ' ENABLE TRIGGER ALL' 
    FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME IN (SELECT TABLE_NAME FROM @filter)

    end

最后,最简单的方法是使用在2个服务器之间创建一个链接服务器,并执行我的查询,从两个服务器获取数据并排除第一个服务器的ID


感谢大家的回复。

您可以直接将数据从一个服务器导入到另一个服务器,而无需csv。如果您没有配置链接连接,请在任一服务器上的任何数据库上使用SSITRY右键单击ssms,然后选择“任务”->“导入/导出数据”,这将运行向导,该向导将指导您使用查询中的逻辑在server1上生成脚本,然后在server2上执行该查询的结果。这两个实例是否可以看到对方?你能从一个ping到另一个ping吗?如果是这样,请在两者之间创建一个链接服务器,然后只进行插入。如果没有,则使用SSIS或导出/导入文件。我建议您查看SSIS或Azure Data Factory。它们是为这样的东西而设计的,很容易在这样一个简单的场景中工作。服务器链接是一个脆弱的解决方案。