GuilleSQL :: Microsoft SQL Server, SSIS, y más !! Destroy On Sight - Listen Up !!

SQL Server FAQ: ¿Cómo ejecutar consultas dinámicas sobre OPENROWSET o sobre Servidores Vinculados (OPENQUERY)?

{{ Si desea volver al INDICE de SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server, haga click aquí }}


Una limitación al utilizar OPENROWSET u OPENQUERY en SQL Server es que no es posible utilizar variables para especificar los datos de conexión o la consulta (SQL o MDX) que se desea ejecutar. Entonces, al ejecutar consultas AdHoc con SQL Server (ya sea con OPENROWSET o con OPENQUERY) ¿Cómo especificar de forma variable o dinámica los datos de conexión? ¿Cómo especificar de forma variable o dinámica la consulta a ejecutar?. Esta funcionalidad que en ciertas ocasiones puede resultar muy-muy apetecible, es fácilmente remediable utilizando SQL Dinámico (ya sabemos, que el SQL Dinámico es una de esas funcionalidades tan queridas como odiadas entre los profesionales de SQL Server).

Como ejemplo vamos a tomar el caso de OPENROWSET, aunque con OPENQUERY sería el mismo razonamiento. El escenario es el siguiente: ejecutar una consulta de SQL Dinámico, la cual utilice OPENROWSET u OPENQUERY, de tal modo que dicha consulta de SQL Dinámico será una simple variable de tipo VARCHAR o NVARCHAR (recordar que sp_executesql require NVARCHAR), sobre la cual si podremos concatenar texto u otras variables, para de este modo poder especificar a través de variable la consulta que queremos ejecutar sobre OPENROWSET u OPENQUERY, y también poder especificar a través de variable lo datos de conexión, como es el caso del Driver OLEDB y la Cadena de Conexión en el caso de OPENROWSET, o el nombre del Servidor Vinculado en el caso de OPENQUERY.

Es importante recordar, que uno de los más importantes problemas de la utilización de SQL Dinámico, es el riesgo de sufrir ataques SQL Injection, lo cual queda fuera del alcance del presente artículo (lo que no quita, que debamos tenerlo en cuenta, claro... ).

A continuación se muestra un ejemplo de SQL Dinámico y OPENROWSET:

DECLARE @DriverOLEDB AS NVARCHAR(50)
DECLARE @ConnString AS NVARCHAR(100)
DECLARE @Consulta AS NVARCHAR(4000)

SET @DriverOLEDB = N'SQLNCLI'
SET @ConnString = N'Server=NombreServidor\NombreInstancia;Trusted_Connection=yes;'
SET @Consulta = N'SELECT * FROM NombreBaseDatos.dbo.NombreTabla'

DECLARE @SQL NVARCHAR(4000)
SET @SQL=N'SELECT * FROM OPENROWSET(''' + @DriverOLEDB + ''', ''' + @ConnString + ''', N''' + @Consulta + ''')'

EXEC sp_executesql @SQL

Téngase en cuenta, que es posible ejecutar SQL Dinámico tanto con sp_executesql como con EXECUTE. Soy partidario y tengo costumbre de utilizar sp_executesql, aunque la diferencia entre ambos métodos queda fuera del alcance de este artículo.

Resulta interesante recordar la posiblidad de ejecutar consultas MDX desde SQL Server, especificando los datos de conexión de la instancia de Analysis Services deseada (empleando el Proveedor MSOLAP). Igualmente, resulta interesante para poder ejecutar consultas SQL sobre otros motores de base de datos relacionales, como es el caso de Informix, DB2, ORACLE, etc.

Por último, como complemento a la lectura del presente artículo, aprovecho para recomendar la lectura del artículo ¿Qué es un Servidor Vinculado? ¿Para qué sirve un Servidor Vinculado? ¿Cómo crear un Servidor Vinculado? ¿Cómo configurar un Servidor Vinculado?




{{ Si desea volver al INDICE de SQL Server FAQ :: Preguntas y Respuestas Frecuentes de SQL Server :: Manual SQL Server, haga click aquí }}




[Fecha artículo: 30/10/2008]
[Estado artículo: Cerrado]
[Autor: GuilleSQL]

Miembros de
Miembros de GITCA (Global IT Community Association)

Menu de Usuario
  Iniciar Sesión
  Registrarse
  Restablecer Contraseña
  Ventajas de Registrarse

Acerca de
  Contigo desde Oct 2007
  195 usuarios registrados
  57069 pageloads/mes
  Ranking Alexa 962623



Archivo

Agosto de 2010 (1)
Julio de 2010 (3)
Mayo de 2010 (5)
Abril de 2010 (6)
Marzo de 2010 (8)
Febrero de 2010 (3)
Enero de 2010 (1)
Diciembre de 2009 (9)
Noviembre de 2009 (14)
Octubre de 2009 (2)
Septiembre de 2009 (8)
Agosto de 2009 (2)
Julio de 2009 (10)
Junio de 2009 (9)
Mayo de 2009 (10)
Abril de 2009 (9)
Marzo de 2009 (3)
Febrero de 2009 (2)
Enero de 2009 (3)
Noviembre de 2008 (2)
Octubre de 2008 (2)
Septiembre de 2008 (2)
Agosto de 2008 (5)
Julio de 2008 (5)
Junio de 2008 (1)
Mayo de 2008 (3)
Abril de 2008 (2)
Marzo de 2008 (2)
Febrero de 2008 (2)
Enero de 2008 (5)
Noviembre de 2007 (2)
Octubre de 2007 (2)






Esta información se proporciona "como está" sin garantías de ninguna clase, y no otorga ningún derecho.
This information is provided "AS IS" with no warranties, and confers no rights.

Copyright © 2007 GuilleSQL, todos los derechos reservados.
GuilleSQL.com y GuilleSQL.net son también parte de Portal GuilleSQL.

Visitas recibidas (Page Loads) en GuilleSQL (fuente: StatCounter):

screen resolution stats
Visitas