Sql server 完成后要回滚的openquery APEAR
我正在使用以下查询Sql server 完成后要回滚的openquery APEAR,sql-server,sql-server-2012,openquery,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]
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
')
当我在查询中执行select时,它工作得很好:
但是当我在通话结束后检查数据库时,记录就不在了
所以我怀疑一笔交易被回滚了。我的问题是:为什么。在这种情况下,我可以做些什么来防止事务回滚。好吧,像往常一样,经过几天的努力,我在stackoverflow上发布了一个问题,我找到了解决方案: 我和你有同样的问题,差点就放弃了,但我已经放弃了 终于找到了问题的答案。读一篇关于 在存储过程之间共享数据我发现OPENQUERY 发出一个隐式事务,并且它正在回滚我的插入。 因此,我必须向我的存储过程添加一个显式的提交 另外,我发现如果我在具有联合的查询中使用它 它必须提交两次。因为我正在一个开始里插入 试试看,我总是可以承诺两次,而不必担心这是否是真的 在联盟中使用的。如果存在错误,我将返回不同的值 错误,但这只是我调试的一部分
在我的例子中,添加一个
;承诺代码>在插入解决问题后,确保将其写入数据库。好吧,像往常一样,经过几天的努力,我在stackoverflow上发布了一个问题,我找到了解决方案:
我和你有同样的问题,差点就放弃了,但我已经放弃了
终于找到了问题的答案。读一篇关于
在存储过程之间共享数据我发现OPENQUERY
发出一个隐式事务,并且它正在回滚我的插入。
因此,我必须向我的存储过程添加一个显式的提交
另外,我发现如果我在具有联合的查询中使用它
它必须提交两次。因为我正在一个开始里插入
试试看,我总是可以承诺两次,而不必担心这是否是真的
在联盟中使用的。如果存在错误,我将返回不同的值
错误,但这只是我调试的一部分
在我的例子中,添加一个;承诺代码>在插入解决它之后,并确保它被写入数据库
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