2016-07-28 23 views
0

Ich benutze die folgende Abfrage.openquery apears wird zurückgesetzt, wenn fertig

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 
         ') 

, wenn ich einen wählen aus der Abfrage durchführen funktioniert es ganz gut:

enter image description here

Aber wenn ich meine Datenbank zu überprüfen, wenn der Anruf beendet ist, wird der Datensatz nicht mehr da .

So vermute ich, dass eine Transaktion zurückgesetzt wird. Meine Frage ist: Warum? Was kann ich tun, um zu verhindern, dass die Transaktion zurückgesetzt wird, wenn dies der Fall ist?

Antwort

0

Nun, wie immer, nach Tagen kämpfen und ich auch eine Frage auf Stackoverflow finde ich die Lösung: http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

ich das gleiche Problem war, wie Sie und fast auf sie aufgegeben habe aber schließlich eine Antwort auf das Problem gefunden. Lesen eines Artikels über Freigabe von Daten zwischen gespeicherten Prozeduren Ich entdeckte, dass OPENQUERY eine implizite Transaktion ausgibt und dass es meine Einfügung Rollback war. Also musste ich einen expliziten Commit zu meinen gespeicherten Prozeduren hinzufügen, in zusätzlich Ich entdeckte, dass wenn ich es in einer Abfrage verwenden, die eine Union hat, muss zweimal Commit werden. Da ich meine Eingabe in einem BEGINN TRY mache, kann ich immer nur zweimal committen und mich nicht darum kümmern, ob es in einer UNION ist. Ich gebe verschiedene Werte zurück, wenn es einen Fehler gibt, aber das war nur ein Teil meines Debugging.

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 

In meinem Fall ein ;COMMIT; Zugabe, nachdem die Einsätze es gelöst, und sorgte dafür, dass es in die Datenbank geschrieben wurde.