2016-07-28 21 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;后的刀片解决了它,并确保它得到了写入到数据库。