2016-07-28 45 views
0

我正在使用以下查詢。openquery apears完成後回滾

select * from OPENQUERY(EXITWEB,N'SET NOCOUNT ON; 
         declare @result table (id int); 
          insert into [system_files] ([is_public], [file_name], [file_size], [content_type], [disk_name], [updated_at], [created_at]) 
        output inserted.id into @result(id) 
        values (N''1'',N''7349.jpg'',N''146921'',N''image/jpeg'',N''5799dcc8a1eb1413195192.jpg'',N''2016-07-28 10:22:00.000'',N''2016-07-28 10:22:00.000'') 

         declare @id int = (select top 1 id from @result) 
         select * from system_files where id = @id 
         insert into linkToExternal (id, id_ext) values(@id, 47) 
         --select @id 
         ') 

當我從查詢中進行選擇它工作得很好:

enter image description here

但是,當我去檢查我的數據庫,當呼叫結束後,記錄不再出現。

所以我懷疑一個事務回滾。我的問題是:爲什麼。如果是這種情況,我可以做些什麼來防止事務被回滾。

回答

0

嗯,一如既往地掙扎,我上張貼問題的天后計算器我找到了解決辦法:http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

我有同樣的問題,因爲你幾乎放棄了,但有 最後找到了問題的答案。閱讀關於 在存儲過程之間共享數據的文章我發現OPENQUERY 發出了一個隱式事務並且它正在回滾我的插入。 所以我不得不添加一個明確的提交到我的存儲過程,在 另外我發現,如果我用它在一個查詢有一個聯盟 它必須被委託兩次。由於我在BEGIN TRY內部進行插入操作,因此我總是可以提交兩次,而不用擔心在UNION中是否使用了 。如果出現 錯誤,我將返回不同的值,但這只是我調試的一部分。

SELECT TOP 5 * 
FROM mm 
JOIN OPENQUERY([LOCALSERVER], 'EXEC cms60.dbo.sp_RecordReportLastRun ''LPS'', ''Test''') RptStats ON 1=1 


ALTER PROCEDURE [dbo].[sp_RecordReportLastRun] 
-- Add the parameters for the stored procedure here 
@LibraryName varchar(50), 
@ReportName varchar(50) 

AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements. 
SET NOCOUNT ON; 
-- Insert statements for procedure here 
BEGIN TRY 
INSERT INTO cms60.dbo.ReportStatistics (LibraryName, ReportName, RunDate) VALUES (@LibraryName, @ReportName, GETDATE()) 
-- 
COMMIT; --Needed because OPENQUERY starts an Implicit Transaction but doesn't commit it.  
COMMIT; --Need second Commit when used in a UNION and although it throws an error when not used in a UNION doesn't cause a problem. 
END TRY 
BEGIN CATCH 
SELECT 2 Test 
END CATCH 
SELECT 1 Test 
END 

在我的情況下,添加一個;COMMIT;後的刀片解決了它,並確保它得到了寫入到數據庫。