Я довольно рукожоп и академиев не заканчивал, потому многое приходится осваивать методом проб и ошибок.
Внезапно встала задача такая, есть два MSSQL сервера в различных сегментах сети, достаточно жетко разграниченных по портам. MSDTC между ними поднять в виду этой особенности нельзя. Теперь задача - вставить в таблицу на одном сервере данные из таблицы на другом.
Если делать в лоб на сервере-приёмнике что-то такого вида
INSERT INTO table1 (c1, c2) SELECT v1, v2 from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth
то происходит попытка запустить распределённую транзакцию, которая ожидаемо проваливается с ошибкой "Error Code: 0x8004d00a, New transaction cannot enlist in the specified transaction coordinator", т.к. координатор на сервере-источнике не доступен.
Как же сделать так, чтобы распределённая транзакция не запускалась? Через BULK INSERT же, он не транзакционен! Ну, и одну временную таблицу. Одна инструкция распадается на три:
SELECT v1, v2 INTO #t from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth -- вот он, BULK INSERT.
INSERT INTO table1 (c1, c2) SELECT * from #t
DROP TABLE #t
Не благодарите.
Внезапно встала задача такая, есть два MSSQL сервера в различных сегментах сети, достаточно жетко разграниченных по портам. MSDTC между ними поднять в виду этой особенности нельзя. Теперь задача - вставить в таблицу на одном сервере данные из таблицы на другом.
Если делать в лоб на сервере-приёмнике что-то такого вида
INSERT INTO table1 (c1, c2) SELECT v1, v2 from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth
то происходит попытка запустить распределённую транзакцию, которая ожидаемо проваливается с ошибкой "Error Code: 0x8004d00a, New transaction cannot enlist in the specified transaction coordinator", т.к. координатор на сервере-источнике не доступен.
Как же сделать так, чтобы распределённая транзакция не запускалась? Через BULK INSERT же, он не транзакционен! Ну, и одну временную таблицу. Одна инструкция распадается на три:
SELECT v1, v2 INTO #t from SERVER2.DB2.dbo.table2 v1,v2 where v1=smth -- вот он, BULK INSERT.
INSERT INTO table1 (c1, c2) SELECT * from #t
DROP TABLE #t
Не благодарите.