openquery apears完成后回滚

时间:2016-07-28 10:34:51

标签: sql-server sql-server-2012 openquery

我正在使用以下查询。

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

但是当我在通话结束时检查我的数据库时,记录不再存在。

所以我怀疑交易被回滚了。我的问题是:为什么。如果是这种情况,我该怎么做才能阻止事务回滚。

1 个答案:

答案 0 :(得分:1)

好吧,和往常一样,经过几天的挣扎,我在stackoverflow上发布了一个问题,我找到了解决方案:http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

  

我遇到了和你一样的问题,几乎放弃了但是却有   终于找到了问题的答案。阅读一篇关于的文章   在存储过程之间共享数据我发现了OPENQUERY   发出一个隐式交易,它正在回滚我的插入。   所以我必须在我的存储过程中添加一个显式的Commit   另外我发现如果我在一个有联盟的查询中使用它   它必须两次通勤。因为我在BEGIN中进行插入操作   我可以随便做两次而不用担心是不是   在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;解决了它,并确保将其写入数据库。