Ir al contenido principal

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

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.

Comentarios

Entradas populares de este blog

SQL Server Analysis Services Neural Network Data Mining Algorithm

Problem In data mining and machine learning circles, the neural network is one of the most difficult algorithms to explain. Fortunately, SQL Server Analysis Services allows for a simple implementation of the algorithm for data analytics.  Check out this tip to learn more. Solution In this tip, we show how to create a simple data mining model using the Neural Network algorithm in SQL Server Analysis Services 2012. In Visual Studio (also known from the start menu as SQL Server Data Tools), create a new Analysis Services Multidimensional and Data Mining Project. In this tip, we will name the project NeuralNetworkExample. Click on OK when finished with the New Project window. In the Solution Explorer window, right-click on the Data Sources folder and choose "New Data Source..." to initiate the Data Source Wizard. Click on "Next >". Choose your data connection, if one exists. If a data connection does not exist, click on "New..." to ...

Big Data Clusters in SQL Server 2019: A Game Changer for Data Analytics

 In today’s data-driven world, organizations are constantly seeking innovative ways to process and analyze vast amounts of data. SQL Server 2019 introduced Big Data Clusters (BDC) , a revolutionary feature that integrates SQL Server, Apache Spark, and Hadoop Distributed File System (HDFS) into a single platform. This feature allows enterprises to process structured and unstructured data efficiently, making it an essential tool for businesses handling large datasets. With the growing complexity of data ecosystems, enterprises require an integrated approach to manage, process, and analyze vast amounts of information. Traditional databases often struggle to handle such workloads efficiently, making big data solutions crucial. SQL Server 2019, with its Big Data Clusters , brings forth an innovative approach to handling large-scale data by bridging the gap between structured and unstructured datasets , enabling businesses to extract meaningful insights quickly. What is a Big Data Clus...

Habilitando Conexiones Remotas a SQL Server 2005

Habilitando conexiones remotas en SQL Server 2005 Hace unos pocos días me encontré ante el siguiente problema: desde una máquina virtual montada en VMWare con Windows XP y SQL Server 2005, necesitaba realizar una prueba consistente en conectar a otro servidor SQL Server 2005, instalado en la máquina principal con Windows Vista, para consultar una tabla existente en una de sus bases de datos. Pensando en que por defecto, la posibilidad de conexión ya estaría habilitada en el servidor SQL, intenté registrar desde la máquina virtual el SQL Server del equipo principal, obteniendo el error que vemos en la siguiente imagen. Tengo instalada la edición Developer de SQL Server 2005, y dado que evidentemente, la posibilidad de conectar a una instalación remota existente en otro servidor de datos no se encontraba establecida por defecto, había que habilitarla de forma manual. A continuación describimos los pasos a realizar para habilitar el establecimiento de conexiones remotas en SQL Se...