開發同事反饋一個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
對於這種問題,是由於:對於大多數 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