SQL Server 2008: вставка в таблицу пакетами - PullRequest
1 голос
/ 01 февраля 2011

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

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

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

Спасибо
Karl

1 Ответ

1 голос
/ 02 февраля 2011

Обычно я использую python с модулем 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...