我正在使用以下查询。
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
')
当我从查询中执行选择时,它可以正常工作:
但是当我在通话结束时检查我的数据库时,记录不再存在。
所以我怀疑交易被回滚了。我的问题是:为什么。如果是这种情况,我该怎么做才能阻止事务回滚。
答案 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;
解决了它,并确保将其写入数据库。