2016-07-28 3 views
0

다음 쿼리를 사용하고 있습니다.openquery가 끝나면 롤백됩니다.

enter image description here

를하지만 통화가 완료되면 내 데이터베이스를 확인 갈 때, 기록이 더 이상 없다 : 나는 쿼리 내에서 선택을 수행 할 때

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

음, 언제나처럼, 어려움을 겪고과 나에 대한 질문을 게시 며칠 후 나는 해결책 찾기에 유래 : http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

당신이하고 거의 포기 나는이 같은 문제가되었다하지만 결국 이 문제에 대한 답을 찾았습니다. 저장 프로 시저간에 데이터를 공유하는 에 대한 기사를 읽으면 OPENQUERY 이 암시 적 트랜잭션을 발행하고 내 삽입을 롤백하고 있음을 발견했습니다. 그래서 저장 프로 시저에 명시 적으로 Commit을 추가해야했습니다. 추가로 Union 이있는 쿼리에서이 쿼리를 두 번 사용해야한다는 것을 발견했습니다. 내 삽입물을 BEGIN TRY 안에 넣고 있기 때문에 항상 두 번 커밋 할 수 있으며 UNION에서 사용중인 인지 걱정하지 않아도됩니다. 오류가있는 경우 다른 값을 반환하지만 디버깅 중 일부는 잘못된 것입니다. 인서트가 그것을 해결하고이 데이터베이스에 기록되었다 확인했다 후 ;COMMIT;를 추가 내 경우

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 

.