2016-07-28 2 views
0

J'utilise la requête suivante.openquery s'affiche pour être annulé une fois terminé

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

lorsque j'effectue une sélection à partir de la requête, il fonctionne très bien:

enter image description here

Mais quand je vais vérifier ma base de données lorsque l'appel est terminé, l'enregistrement n'est plus là . Donc, je soupçonne une transaction est annulée. Ma question est: pourquoi. Que puis-je faire pour empêcher la transaction d'être annulée si c'est le cas.

Répondre

0

Eh bien, comme toujours, après plusieurs jours de lutte et me poser une question sur stackoverflow je trouve la solution: http://www.sqlservercentral.com/Forums/Topic1128997-391-1.aspx#bm1288825

j'avais le même problème que vous et presque abandonné sur le sujet, mais ont enfin trouvé une réponse au problème. En lisant un article sur en partageant des données entre des procédures stockées, j'ai découvert que OPENQUERY émettait une Transaction Implicite et qu'il annulait mon insertion. J'ai donc dû ajouter un commit explicite à mes procédures stockées, en j'ai découvert que si je l'utilise dans une requête qui a un Union il doit être validé deux fois. Comme je fais mon insertion dans un BEGIN TRY je peux toujours juste commettre deux fois et ne pas s'inquiéter de savoir si c'est utilisé dans un UNION. Je retourne des valeurs différentes s'il y a une erreur mais c'était juste à côté de mon débogage.

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 

Dans mon cas, l'ajout d'un ;COMMIT; après les inserts résolus, et fait en sorte qu'il se est écrit dans la base de données.