none
¿Cómo ejecutar un sp desde otro en diferente servidor?

    Pregunta

  • Hola,

    desde un stored procedure (sp) necesito ejecutar otro que está en servidores diferentes.

    Estos servidores los tengo vinculados, la cosa es que según el valor de un parámetro, tengo que apuntar a un servidor o a otro.

    La dirección del servidor la tengo en una variable, no quiero, por ejemplo (poner la dirección IP del servidor 'hard code', ya me pueden cambiar la bbdd de servidor y debería retocar todos los sp creados), vamos, que la dirección del servidor ha de ser un parámetro.

    Saludos y gracias por la ayuda.

    martes, 11 de junio de 2013 11:19

Respuestas

  • Nuevamente, si nos dices por qué no te está funcionando igual te podemos ayudar. Por ejemplo, si el código te devuelve algún mensaje de error, sería bueno poder contar con él.

    De todos modos, por lo que veo, al menos te falta declarar la variable @_return_value como OUTPUT:

    SET @ParmDefinition = N'@_return_value int OUTPUT, @_V1 nvarchar(10), @_V2 ';
    

    • Marcado como respuesta weatherby miércoles, 12 de junio de 2013 6:59
    martes, 11 de junio de 2013 15:00

Todas las respuestas

  • Yo lo haría a través de IF, porque no creo que tengas muchos servidores vinculados, pero si no quieres hacer algo así, no te queda otra que usar query dinámico, al estilo de:

    DECLARE @servidor sysname, @sSql NVARCHAR(1000)
    
    SET @servidor = 'serverRemoto'
    
    SET @sSql = 'EXEC ' + @servidor + '.bbdd.schema.sproc'
    
    EXEC (@sSql)
    
    
    

    Ahora, que debes tener en cuenta las implicaciones de usar esta característica: The Curse and Blessings of Dynamic SQL

    martes, 11 de junio de 2013 11:36
  • Hola Carlos,

    es posible utilizar sp_executesql ?

    martes, 11 de junio de 2013 12:33
  • Sí claro, al final es lo mismo
    martes, 11 de junio de 2013 12:56
  • quiero decir desde sp_executasql ejecutar un: exec 'algo'

    Lo pregunto porque estoy hacindo alguna prueba y no lo consigo :(

    martes, 11 de junio de 2013 13:03
  • Tanto en la documentación oficial como en el artículo del que te pasé su enlace antes vienen ejemplos de cómo se usa correctamente ese procedimiento.

    Ahora, si no nos dices qué es lo que está fallando, malamente te vamos a poder ayudar.

    martes, 11 de junio de 2013 13:29
  • Hola Carlos,

    no consigo que me funcione, creo que es algo al intentar recuperar el valor de retorno de la ejecución del sp para controlar si ha ido bien o no, es parte de una transacción y si falla he de tirar atrás otras acciones realizadas.

    El código es algo así:

    SET @sql = 'DECLARE	@fecha datetime; SET @fecha = GETDATE(); '
    IF @sitio = 'LOCAL'
       SET @sql=@sql+ 'EXEC	@_return_value = [BBDD].[dbo].[STORED_P] '
    ELSE
       SET @sql=@sql+ 'EXEC	@_return_value = ['+@IP+'].[BBDD].[dbo].[STORED_P] '
    SET @sql=@sql+ '@V1 = @_V1, @V2 = @_V2 '
    SET @ParmDefinition = N'@_return_value int, @_V1 nvarchar(10), @_V2 ';
    exec sp_executesql @sql, @ParmDefinition, 
           @_return_value = @return_value OUTPUT,
           @_V1 = @V1,
           @_V2 = @V2;
    IF @return_value <> 0
       RAISERROR ('Error', 100, -1);

    Utilizo sp_executesql porque no se como recuperar el código de retorno de la ejecución con EXEC.

    martes, 11 de junio de 2013 14:49
  • Nuevamente, si nos dices por qué no te está funcionando igual te podemos ayudar. Por ejemplo, si el código te devuelve algún mensaje de error, sería bueno poder contar con él.

    De todos modos, por lo que veo, al menos te falta declarar la variable @_return_value como OUTPUT:

    SET @ParmDefinition = N'@_return_value int OUTPUT, @_V1 nvarchar(10), @_V2 ';
    

    • Marcado como respuesta weatherby miércoles, 12 de junio de 2013 6:59
    martes, 11 de junio de 2013 15:00
  • Carlos,

    justamente era eso, no había declarado esa variable como de salida también en la definición de parámetros. Ahora ya me funciona correctamente.

    Gracias

    miércoles, 12 de junio de 2013 6:59
  • con el EXEC solo tienes que poner OUTPUT detrás de los parámetros de salida del procedimiento y almacenarlo en una variable local, por ejemplo:

    declare @v1 varchar(10);

    declare @v2 varchar(10); --esta sería de entrada/salida.

    EXEC miprocedimiento @v1, @v2 OUTPUT;

    miércoles, 12 de junio de 2013 8:01