Ejecutando Stored Procedures en MySql desde SQL Server via Linked Servers

Como ya había platicado antes, manejo un conjunto de Linked Servers o Servidores Ligados desde SQL Server. Cada uno de estos va a un servidor físico que se tiene en cada sucursal de la compañía en un estado diferente de la República Mexicana y obtiene la información, vía ODBC.

Cada uno de estos servidores tiene OpenSuse y las bases de datos estan en MySQL. Gracias a esta liga,  yo creo mis Queries en SQL Server Management Studio con sintaxis propia de SQL Server sin preocuparme de la sintaxis de MySQL o si el query que estoy creando correría en el Administrador de MySQL.

Esto me lleva a que normalmente ya a estas alturas del partido, las funciones de SQL Server tienen su equivalencia en MySQL y viceversa,  por lo que migrar un query de una plataforma a otra tampoco es tan complicado. Sin embargo, hoy me tope con la funcion: Group_Concat() de MySql, la cual definitivamente no cuenta con una equivalencia en SQL Server.

Tenia que migrar un query de MySql a SQL Server y tras algo de trabajo, mas debido a la extensión del mismo que a la dificultad de la migración, me encontré con que aparecian duplicidades que no deberian en el resultado. Fué entonces que analizando mas a profundidad, encontré el Group_Concat(), el cual yo erroneamente había pasado por una mera concatenación.

Explico, tengo una tabla del tipo:

ID          Cadena1          Cadena2

1             ‘Visita 1’          ‘Visita 2’

1             ‘Visita 3’          ‘Visita 4’

y lo que necesitaba obtener era:

1      ‘Visita 1, Visita 3’       ‘Visita 2, Visita 4’

cosa que se obtiene facilmente en MySql tan solo con un Group_Concat(), pero esta funcion no existe en SQL Server!!!

Tras pasar un muy buen tiempo buscando una alternativa a esta situación, y en de paso encontrando un par de temas que investigare ya que reconozco mi conocimiento al respecto, a un compañero de aqui de la oficina (quien es el que mueve toda la parte de mysql directo en mysql), se le ocurrió hacer un Stored Procedure en mysql y que yo lo llamara desde SQL Server mediante mis Linked Servers y de esta manera pudieramos aprovechar la funcion Group_Concat().

Y pues sonaba bastante atractiva la propuesta, sobre todo dado el hecho de la escases de tiempo. Asi pues, me puse a checar como ejecutar un Stored Procedure via mi Linked Server y pues aqui esta lo que encontre:

1. Los Stored Procedures se ejecutan en MySql mas como ejecutaria una Función Escalar en SQL Server que como lo haria con un SP (a reserva que no soy experta en el tema), quedandome algo como esto:

call SP_Bitacora(‘2011-03-31’)

2. Bien pues una vez sabiendo lo anterior llegamos al punto de como ejecutarlo con mi Linked Server, y resulto bastante sencillo:

exec (”call SP_Bitacora(””2011-03-31””)”) at <LinkedServer>

3.Sensacional pues!!! ahora solo quedaba hacer la llamada dinámica. Con esto me refiero a que el Linked Server cambia dependiendo de la @Sucursal que yo le mande al Stored Procedure desde el cual llamare el Stored Procedure de MySql (Cielos! tantas vueltas) entonces para finalizar quedo asi:

Declare @str nvarchar(4000)

set @str = ‘exec (”call SP_Bitacora(””2011-03-31””)”) at ‘ + @BD

execute(@str)

donde claro @BD es una variable tipo nvarchar(80) la cual lleno con un valor almacenado en una tabla donde tengo relacionadas mis sucursales con mis linked servers =)

y tadaaaaaaaa funciones de mysql en SQL Server…

UPDATE: Se me olvido mencionar, que para poder ejecutar nuestro Stored Procedure via el Linked Server, este debe tener activada, en la sección de Opciones de Servidor, la propiedad RPC = true.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s