Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En SQL Server, hay tres maneras de ejecutar una consulta de forma remota:
OPENQUERYOPENROWSETEXECUTE AT
En este artículo se describen estos tres métodos.
OPENQUERY
Ejecuta la consulta de 'pass-through' especificada en el servidor enlazado especificado. Este servidor es un origen de datos OLE DB. En una consulta, use OPENQUERY en como FROM si fuera un nombre de tabla. También puede hacer referencia a OPENQUERY como tabla de destino en una instrucción INSERT, UPDATE o DELETE. Esto está sujeto a las capacidades del proveedor OLE DB. Aunque la consulta puede devolver varios conjuntos de resultados, OPENQUERY devuelve solo el primero.
OPENQUERY requiere un servidor vinculado previamente agregado y configurado y un texto de solicitud a un servidor remoto.
OPENQUERY no requiere una convención de nombre de cuatro partes para acceder a los objetos.
OPENROWSET
Incluye toda la información de conexión necesaria para acceder a datos remotos desde un origen de datos OLE DB. Es un método alternativo para tener acceso a las tablas de un servidor vinculado y, al mismo tiempo, es un método ad hoc para conectarse y tener acceso a datos remotos utilizando OLE DB. Para referencias más frecuentes a orígenes de datos OLE DB, considere la posibilidad de usar servidores vinculados, PolyBase o conexiones directas entre los dos orígenes de datos a través de herramientas como SQL Server Integration Services (SSIS) o aplicaciones personalizadas.
En una consulta, use OPENROWSET en la cláusula FROM de la misma. También puede usar OPENROWSET como tabla de destino de una INSERT instrucción, UPDATE, o DELETE, sujeto a las capacidades del proveedor OLE DB. Aunque la consulta puede devolver varios conjuntos de resultados, OPENROWSET solo devuelve el primero.
OPENROWSET también admite operaciones masivas a través de un proveedor integrado BULK que permite que los datos de un archivo se lean y devuelvan como un conjunto de filas.
Para obtener más información, OPENROWSET use una cadena de conexión escrita explícitamente.
EJECUTAR EN
Permite que SQL dinámico se ejecute en un servidor vinculado. Uno de los parámetros de la llamada EXECUTE es AT, que está diseñado para omitir las restricciones de OPENQUERY y OPENROWSET.
EXECUTE (``<query>``) AT [<linked server>] es SQL dinámico que puede devolver cualquier número de conjuntos de resultados desde un servidor remoto.
Guía para SQL dinámico
Evite el uso de comandos SQL dinámicos en aplicaciones y restrinja los permisos de los usuarios con acceso a comandos SQL dinámicos. La construcción de consultas que se van a ejecutar a través de EXECUTE puede crear vulnerabilidades en sitios web y aplicaciones mediante ataques de inyección SQL. Para obtener más información, consulte SQL Injection.
Cuando el rendimiento es un problema, pruebe las consultas remotas:
- Asegúrese de que la mayor cantidad de lógica posible se ejecute en el servidor remoto.
- Compruebe los índices de las tablas de índice del servidor remoto de forma adecuada para admitir la consulta.
- Tenga en cuenta que el uso de consultas remotas en un código base complica el control de versiones del código de base de datos y el mantenimiento de entornos de desarrollo y pruebas.
Ejemplos
A. Ejecuta una consulta SELECT de paso directo con OPENQUERY
En el ejemplo siguiente se usa una consulta SELECT de paso a través para seleccionar las filas con OPENQUERY:
SELECT *
FROM OPENQUERY ([linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer');
B. Ejecución de una consulta SELECT de paso a través con OPENROWSET
En el ejemplo siguiente se usa una consulta de transferencia SELECT para seleccionar las filas con OPENROWSET
SELECT a.*
FROM OPENROWSET('MSOLEDBSQL', [linkedserver],
'SELECT * FROM AdventureWorksLT.SalesLT.Customer') AS a;
SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). Para nuevos trabajos de desarrollo, no se recomiendan ni el proveedor OLE DB de SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft para SQL Server (SQLOLEDB) heredado. Cambie al nuevo Controlador Microsoft OLE DB para SQL Server de ahora en adelante.
C. Ejecutar una consulta de paso SELECT con EXECUTE AT
En el ejemplo siguiente se usa una consulta de paso a través SELECT para seleccionar las filas con EXECUTE ... AT
EXECUTE ('SELECT * FROM AdventureWorksLT.SalesLT.Customer') AT [linkedserver]
D. Ejecutar varias instrucciones SELECT
En el ejemplo siguiente se usa una consulta de paso a través SELECT y se obtienen varios conjuntos de resultados.
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer;
SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.CustomerAddress;') AT [linkedserver];
E. Ejecutar un SELECT y pasar dos argumentos
En el ejemplo siguiente se usa un paso a través SELECT con dos argumentos
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer
WHERE CustomerID = ? AND LastName = ?', 10, 'Garza') AT [linkedserver];
F. Ejecutar un SELECT y pasar dos argumentos mediante variables
En el siguiente ejemplo se utiliza una consulta SELECT de paso a través con dos argumentos usando variables.
DECLARE @CustomerID AS INT
DECLARE @LastName AS VARCHAR(100)
SET @CustomerID = 10
SET @LastName = 'Garza'
EXECUTE ('SELECT TOP 10 * FROM AdventureWorksLT.SalesLT.Customer
WHERE CustomerID = ? AND LastName = ?', @CustomerID, @LastName) AT [linkedserver];
G. Ejecución de instrucciones DDL con EXECUTE mediante servidores vinculados
En el ejemplo siguiente se usa una instrucción DDL en linked Server.
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1
CREATE TABLE dbo.Table1
(
Column1 INT
)' ) AT [linkedserver];
Una vez que haya terminado con las pruebas, limpie los objetos creados.
EXECUTE (
'USE TempDB
IF OBJECT_ID(''dbo.Table1'') IS NOT NULL
DROP TABLE dbo.Table1'
) AT [linkedserver];
EXECUTE sp_dropserver 'linkedserver'
Ejemplos adicionales
Para obtener ejemplos adicionales que muestran cómo utilizar INSERT...SELECT * FROM OPENROWSET(BULK...), consulte los siguientes temas:
- Ejemplos de importación y exportación de forma masiva documentos XML (SQL Server)
- Mantener valores de identidad al importar datos de forma masiva (SQL Server)
- Mantener valores NULL o usar valores predeterminados durante la importación masiva (SQL Server)
- Usar un archivo de formato para importar datos de forma masiva (SQL Server)
- Uso del formato de caracteres para importar o exportar datos (SQL Server)
- Usar un archivo de formato para omitir una columna de tabla (SQL Server)
- Usar un archivo de formato para omitir un campo de datos (SQL Server)
- Usar un archivo de formato para asignar columnas de tabla a campos de archivo de datos (SQL Server)
Véase también
- DELETE (Transact-SQL)
- FROM (Transact-SQL)
- Importar y exportar datos de forma masiva (SQL Server)
- INSERT (Transact-SQL)
- OPENDATASOURCE (Transact-SQL)
- OPENQUERY (Transact-SQL)
- OPENROWSET (Transact-SQL)
- SELECT (Transact-SQL)
- sp_addlinkedserver (Transact-SQL)
- sp_serveroption (Transact-SQL)
- UPDATE (Transact-SQL)
- WHERE (Transact-SQL)