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:
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. |
Comentarios
Publicar un comentario