Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 完成后要回滚的openquery APEAR_Sql Server_Sql Server 2012_Openquery - Fatal编程技术网

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