2011-02-01 4 views
1

У меня есть связанный сервер (Sybase), настроенный в SQL Server, из которого мне нужно извлечь данные. Сервер Sybase находится на другой стороне мира, а подключение довольно дрянное. Я хотел бы вставить данные в одну из таблиц SQL Server в управляемые партии (например, 1000 записей за раз). Я хочу это сделать;SQL Server 2008: вставлять в таблицу пакетами

INSERT IN [SQLServerTable] ([field]) 
SELECT [field] from [LinkedServer].[DbName].[dbo].[SybaseTable] 

, но я хочу получить 1000 записей за раз и вставить их.

Благодаря
Карл

ответ

1

Я обычно использую питона с pyodbc модулем для выполнения партий, как это на сервере SQL. Взгляните и посмотрите, если это вариант, и если да, то я могу привести вам пример.

Вам необходимо будет изменить этот код, чтобы он соответствовал вашей конкретной ситуации, однако вы должны следовать логике. Вы можете прокомментировать строку cnxn.commit(), чтобы отменить транзакции, пока не получите все, что работает.

import pyodbc 

#This is an MS SQL2008 connection string 
conn='DRIVER={SQL Server};SERVER=SERVERNAME;DATABASE=DBNAME;UID=USERNAME;PWD=PWD' 

cnxn=pyodbc.connect(conn) 
cursor=cnxn.cursor() 

rowCount=cursor.execute('SELECT Count(*) from RemoteTable').fetchone()[0] 

cnxn.close() 

count=0 
lastID=0 


while count<rowCount: 
    #You may want to close the previous connection and start a new one in this loop. Otherwise 
    #the connection will be open the entire time defeating the purpose of performing the transactions in batches. 

    cnxn=pyodbc.connect(conn) 
    cursor=cnxn.cursor() 

    rows=cursor.execute('SELECT TOP 1000 ID, Field1, Field2 FROM INC WHERE ((ID > %s)) ' % (lastID)).fetchall() 

    for row in rows: 
     cursor.execute('INSERT INTO LOCALTABLE (FIELD1, FIELD2) VALUES (%s, %s)' % (row.Field1, row.Field2)) 


    cnxn.commit() 
    cnxn.close() 

    #The [0] assumes the id is the first field in the select statement. 
    lastID=rows[len(rows)-1][0] 
    count+=len(rows) 

    #Pause after each insert to see if the user wants to continue. 
    raw_input("%s down, %s to go! Press enter to continue." % (count, rowCount-count)) 
+0

Это может сработать. Примером может служить оценка. Карл – Karl