2016-07-28 4 views
0

次のクエリを使用しています。完了したら、オープンクエリがロールバックされます。

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

まあ、いつものように、苦労と私の日はstackoverflowの上で質問を投稿した後、私は解決策を見つける:http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

私はあなたと同じ問題を抱えて、ほとんどそれをあきらめたが、最終的には を持っていました。問題の答えが見つかりました。ストアドプロシージャ間でデータを共有する に関する記事を読む私は、OPENQUERY が暗黙のトランザクションを発行し、それが私の挿入物をロールバックしていることを発見しました。 私はストアドプロシージャに明示的なCommitを追加する必要がありました。 さらに、Unionを持つクエリで使用すると、 を2回コミットする必要があることがわかりました。私はBEGIN TRYの中に私の挿入を行っているので、私はいつも2回コミットして、 が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;を追加します。

関連する問題