連接服務器"(null)"的 OLE DB 訪問接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."

開發同事反饋一個SQL Server存儲過程執行的時候,報連接服務器"(null)"的 OLE DB 訪問接口 "SQLNCLI10" 返回了消息 "Cannot start more transactions on this session."。這個存儲過程,我的作了一個精簡和脫敏處理後以下:sql

 

BEGIN TRY
    BEGIN TRANSACTION    
                    
    INSERT INTO OPENDATASOURCE('SQLOLEDB', 'DATA SOURCE=XXX.XXX.XX.XXX;USER ID=XXX;PASSWORD=XXX).XXX.DBO.XXX 
    (........)
    SELECT ..... FROM .....
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
      IF @@TRANCOUNT>0
        ROLLBACK
         .........
END CATCH

 

clip_image001

 

對於這種問題,是由於:對於大多數 OLE DB 訪問接口(包括 SQL Server),必須將隱式或顯示事務中的數據修改語句中的 XACT_ABORT 設置爲 ON。 惟一不須要該選項的狀況是在提供程序支持嵌套事務時。具體參考官方文檔:服務器

 

XACT_ABORT must be set ON for data modification statements in an implicit or explicit transaction against most OLE DB providers, including SQL Server. The only case where this option is not required is if the provider supports nested transactions."session

 

在存儲過程裏面的BEGIN TRANSACTION前設置SET XACT_ABORT ON;後問題便可解決。app

 

 

 

參考資料:ide

 

https://docs.microsoft.com/zh-cn/sql/t-sql/statements/set-xact-abort-transact-sql?view=sql-server-2017ui

相關文章
相關標籤/搜索