Saltar al contenido

El uso de INSERT INTO…EXEC AT servidor vinculado en la tabla temporal falla con Msg 7391

Después de tanto trabajar ya hallamos el resultado de este dilema que algunos los usuarios de nuestro espacio presentan. Si tienes algún detalle que compartir puedes compartir tu comentario.

Solución:

En mi prueba (a otra instancia en el mismo servidor, no en un servidor separado), esto funcionó si tenía la opción de servidor vinculado de Habilitar la promoción de transacciones distribuidas para RPC establecido en “Falso”. Puede lograrlo a través del siguiente comando:

EXEC master.dbo.sp_serveroption
       @server = N'linked_server_name',
       @optname = N'remote proc transaction promotion',
       @optvalue = N'false';

Esto funcionó con el Coordinador de transacciones distribuidas (MSDTC) tanto ENCENDIDO (en ejecución) como APAGADO (detenido).

Si normalmente necesita la opción de “promoción de transacción remota” configurada en “Verdadero”, y si la configura en “Falso” lo permite INSERT...EXEC para que funcione, puede configurar otro servidor vinculado con todas las mismas propiedades excepto que esta opción es diferente.

El principal inconveniente de deshabilitar la “promoción de transacciones remotas” es que, bueno, no es una transacción en el servidor remoto. Entonces, si ocurre un error allí, no obtendrá los datos insertados localmente (obviamente), pero si hubo declaraciones DML ejecutadas de forma remota, aún podrían confirmarse (dependiendo de si se trata de una sola declaración o varias declaraciones). Aún así, podría / debería usar el manejo adecuado de transacciones en la consulta remota (es decir, usar el TRY...CATCH construir):

CREATE TABLE #Local ([name] [sysname]);


INSERT INTO #Local ([name])
    EXEC (N'
BEGIN TRY
    BEGIN TRAN;
    SELECT [name] FROM sys.servers WHERE 1/0 = ''a'';
    COMMIT;
END TRY
BEGIN CATCH
    ROLLBACK TRAN;
    THROW;
END CATCH;
') AT [linked_server_name];

pd el RPC Out la opción debe estar habilitada / Verdadero. Esto no se mencionó anteriormente ya que, según un comentario sobre la pregunta, esta opción ya está configurada correctamente.

Puedo usar:

SELECT *
INTO #TABLATEMP
FROM Openquery([link-server-name],N' Execute anything ')

Select Campo1, Campo2, Campo3, .... CampoN
FRom #TABLATEMP

DROP TABLE #TABLATEMP

— ¡¡¡Eso es todo!!!

Te invitamos a proteger nuestra misión mostrando un comentario y puntuándolo te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *