SQL связанный сервер Python pyodb c ошибка вставки - PullRequest
0 голосов
/ 29 апреля 2020

У меня возникает интересная ошибка, когда я пытаюсь запустить SP на локальном SQL -сервере с двумя связанными серверами.

Цель приведенного выше изгнания - переместить данные с одного связанного сервера на другой.

Когда я запускаю SP из SSMS, он работает как чудо, но когда я запускаю его из Python Я получаю эти сексуальные сообщения об ошибках:

(
'42000', '[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The OLE DB provider "SQLNCLI11" for linked server "XXXX" reported an error. One or more arguments were reported invalid by the provider. (7399) (SQLExecDirectW)
; [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The operation could not be performed because OLE DB provider "SQLNCLI11" for linked server "XXXX" was unable to begin a distributed transaction. (7391)
; [42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]OLE DB provider "SQLNCLI11" for linked server "XXXX" returned message "The parameter is incorrect.". (7412)'
)

Короче, мои python сценарии (которые не с ошибками выше) выглядит следующим образом:

MyConn =  pyodbc.connect(DRIVER="ODBC Driver 17 for SQL Server",SERVER=os.environ["sqlServer"],UID=os.environ["sqlUID"],DATABASE=os.environ["sqlDB"],PWD=os.environ["sqlPWD"]) 
Cursor = MyConn.cursor()

sqlQuerey = "exec dbo.usp_XXXXETL @LookBackDays = 0"
Cursor.execute(sqlConta)

I также проверял соединение выше; Я могу запускать операторы select для связанных серверов с python.

Что еще более раздражает, так это то, что когда я пишу это в R, это работает:

conn = odbcDriverConnect("Driver={ODBC Driver 17 for SQL Server};Server=*SameServer*;Database=*SameDB*;Uid=*Uid*;Pwd=*Pwd*;Connection Timeout=360;") 

sqlExecute(
    conn, 
    query="dbo.usp_XXXXETL @LookBackDays = 0", 
    fetch=FALSE,
    errors=TRUE,
    query_timeout=300)

Очевидно, это работает так что это не большая проблема, просто я ненавижу R-scrips и в некотором роде озадачен ошибкой.

Заранее большое спасибо за ваше время и умственные способности!

1 Ответ

1 голос
/ 29 апреля 2020

Вы запустили транзакцию, и связанный сервер настроен на включение удаленного сервера в транзакцию, для чего требуется MSDT C. Так что

1) Не начинать транзакцию. Вы, вероятно, отключили autocommit, в результате чего сеанс использует неявные транзакции .

2) Отключите параметр remote proc transaction promotion для связанного сервера с помощью sp_serveroption

3) Устраните неполадки MSDT C, чтобы включить распределенную транзакцию.

...