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? |