Compartir a través de


OPENROWSET (Transact-SQL)

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores

OPENROWSET es una alternativa a acceder a las tablas de un servidor vinculado y es un método ad hoc único de conexión y acceso a datos remotos. Un OPENROWSET comando T-SQL incluye toda la información de conexión necesaria para acceder a datos remotos desde un origen de datos externo.

Se OPENROWSET puede hacer referencia a la función en la FROM cláusula de una consulta como si fuera un nombre de tabla. También OPENROWSET se puede hacer referencia a la función como la tabla de destino de una INSERTinstrucción , UPDATEo DELETE , sujeta a las funcionalidades del proveedor de datos. Aunque la consulta puede devolver varios conjuntos de resultados, OPENROWSET solo devuelve el primero.

Sugerencia

Para referencias más frecuentes a orígenes de datos externos, use servidores vinculados en su lugar. Para obtener más información, vea Servidores vinculados (Motor de base de datos).

OPENROWSET sin el BULK operador solo está disponible en SQL Server. Detalles y vínculos a ejemplos similares en otras plataformas:

Convenciones de sintaxis de Transact-SQL

Sintaxis

OPENROWSET La sintaxis se usa para consultar orígenes de datos externos:

OPENROWSET
(  'provider_name'
    , { 'datasource' ; 'user_id' ; 'password' | 'provider_string' }
    , {  [ catalog. ] [ schema. ] object | 'query' }
)

Argumentos

"provider_name"

Cadena de caracteres que representa el nombre descriptivo (o PROGID) del proveedor de datos tal como se especifica en el Registro. provider_name no tiene valor predeterminado. Los ejemplos de nombre de proveedor son MSOLEDBSQL, Microsoft.Jet.OLEDB.4.0 o MSDASQL.

'datasource'

Constante de cadena que corresponde a un origen de datos determinado. datasource es la DBPROP_INIT_DATASOURCE propiedad que se va a pasar a la IDBProperties interfaz del proveedor para inicializar el proveedor. Normalmente, esta cadena incluye el nombre del archivo de base de datos, el nombre de un servidor de bases de datos o un nombre que el proveedor entiende para localizar la base de datos o las bases de datos.

El origen de datos puede ser la ruta de acceso de archivo C:\SAMPLES\Northwind.mdb' para el proveedor Microsoft.Jet.OLEDB.4.0, o bien la cadena de conexión Server=Seattle1;Trusted_Connection=yes; para el proveedor MSOLEDBSQL.

"user_id"

Constante de cadena que es el nombre de usuario pasado al proveedor de datos especificado. user_id especifica el contexto de seguridad de la conexión y se pasa como la DBPROP_AUTH_USERID propiedad para inicializar el proveedor. user_id no puede ser un nombre de inicio de sesión de Microsoft Windows.

'password'

Constante de cadena que es la contraseña de usuario que se va a pasar al proveedor de datos. la contraseña se pasa como la DBPROP_AUTH_PASSWORD propiedad al inicializar el proveedor. la contraseña no puede ser una contraseña de Microsoft Windows. Por ejemplo:

SELECT a.* FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\SAMPLES\Northwind.mdb';
    '<user name>';
    '<password>',
    Customers
) AS a;

"provider_string"

Un cadena de conexión específico del proveedor que se pasa como propiedad DBPROP_INIT_PROVIDERSTRING para inicializar el proveedor OLE DB. Normalmente, provider_string encapsula toda la información de conexión necesaria para inicializar el proveedor.

Para obtener una lista de palabras clave que reconoce el proveedor OLE DB de SQL Server Native Client, vea Propiedades de inicialización y autorización (proveedor OLE DB de Native Client). 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.

SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    Department
) AS d;

[ catalog. ] [ esquema. ] (objeto)

Tabla o vista remota que contiene los datos que OPENROWSET debe leer. Puede ser un objeto de nombre de tres partes con los componentes siguientes:

  • catalog (opcional): el nombre del catálogo o de la base de datos donde reside el objeto especificado.
  • schema (opcional): el nombre del esquema o propietario del objeto para el objeto especificado.
  • object: el nombre del objeto que identifica de forma única al objeto con el que se va a trabajar.
SELECT d.* FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    AdventureWorks2022.HumanResources.Department
) AS d;

'query'

Constante de cadena enviada y ejecutada por el proveedor. La instancia local de SQL Server no procesa esta consulta, pero procesa los resultados de la consulta devueltos por el proveedor, una consulta de paso a través. Las consultas de paso a través son útiles cuando se usan en proveedores que no hacen que sus datos tabulares estén disponibles a través de nombres de tabla, sino solo a través de un lenguaje de comandos. El servidor remoto admite las consultas de paso a través siempre y cuando el proveedor de consultas admita el objeto Command de OLE DB y sus interfaces obligatorias.

Para obtener más información, vea Interfaces de SQL Server Native Client (OLE DB).

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL',
    'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT TOP 10 GroupName, Name FROM AdventureWorks2022.HumanResources.Department'
) AS a;

Comentarios

OPENROWSET se puede usar para tener acceso a datos remotos desde orígenes de datos de OLE DB solo cuando la opción de Registro DisallowAdhocAccess está establecida explícitamente en 0 para el proveedor especificado y la opción de configuración avanzada Ad Hoc Distributed Queries está habilitada. Cuando no se establecen estas opciones, el comportamiento predeterminado no permite el acceso ad hoc.

Al acceder a orígenes de datos OLE DB remotos, la identidad de inicio de sesión de las conexiones de confianza no se delega automáticamente desde el servidor en el que el cliente está conectado al servidor que se está consultando. Debe configurarse la delegación de autenticación.

Los nombres de catálogo y esquema son necesarios si el proveedor de datos admite varios catálogos y esquemas en el origen de datos especificado. Los valores de catalog y schema se pueden omitir cuando el proveedor de datos no los admite. Si el proveedor solo admite nombres de esquema, se debe especificar un nombre de dos partes del formulario schema.object . Si el proveedor solo admite nombres de catálogo, se debe especificar un nombre de tres partes del formulario catalog.schema.object . Para más información, vea Convenciones de sintaxis de Transact-SQL.

Los nombres de tres partes son necesarios para las consultas de paso a través que usan el proveedor OLE DB de SQL Server Native Client.

OPENROWSET no acepta variables para sus argumentos.

Las llamadas a OPENDATASOURCE, OPENQUERY o OPENROWSET en la cláusula FROM se evalúan por separado y de forma independiente de otras llamadas a estas funciones usadas como destino de la actualización, incluso si se han suministrado argumentos idénticos a las dos llamadas. En particular, las condiciones de filtro o combinación aplicadas en el resultado de una de esas llamadas no tienen ningún efecto en los resultados de la otra llamada.

Permisos

OPENROWSET los permisos se determinan mediante los permisos del nombre de usuario que se pasa al proveedor de datos.

Ejemplos

En esta sección se proporcionan ejemplos generales para demostrar cómo usar OPENROWSET.

Nota:

Para obtener ejemplos que muestran el uso INSERT...SELECT * FROM OPENROWSET(BULK...)de , vea OPENROWSET BULK (Transact-SQL).

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.

A Uso de OPENROWSET con SELECT y el proveedor OLE DB de SQL Server Native Client

En el siguiente ejemplo se usa el proveedor OLE DB de SQL Server Native Client para tener acceso a la tabla HumanResources.Department de la base de datos AdventureWorks2022 en el servidor remoto Seattle1. (Use MSOLEDBSQL para el proveedor de datos OLE DB moderno de Microsoft SQL Server que reemplazó SQLNCLI). Se usa una SELECT instrucción para definir el conjunto de filas devuelto. La cadena de proveedor contiene las palabras clave Server y Trusted_Connection. El proveedor OLE DB de SQL Server Native Client reconoce estas palabras clave.

SELECT a.*
FROM OPENROWSET(
    'MSOLEDBSQL', 'Server=Seattle1;Trusted_Connection=yes;',
    'SELECT GroupName, Name, DepartmentID
         FROM AdventureWorks2022.HumanResources.Department
         ORDER BY GroupName, Name'
) AS a;

B. Usar el proveedor OLE DB de Microsoft para Jet

En el siguiente ejemplo se obtiene acceso a la tabla Customers de la base de datos Northwind de Microsoft Access a través del proveedor Microsoft OLE DB para Jet.

Nota:

En este ejemplo se supone que Microsoft Access está instalado. Para ejecutar este ejemplo, debe instalar la Northwind base de datos.

SELECT CustomerID, CompanyName
FROM OPENROWSET(
    'Microsoft.Jet.OLEDB.4.0',
    'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';
    'admin';'',
    Customers
);

C. Usar OPENROWSET y otra tabla en inner JOIN

En el ejemplo siguiente se seleccionan todos los datos de la tabla de la Customers instancia local de la base de datos de SQL Server Northwind y de la Orders tabla de la base de datos de Microsoft Access Northwind almacenada en el mismo equipo.

Nota:

En este ejemplo se supone que Microsoft Access está instalado. Para ejecutar este ejemplo, debe instalar la Northwind base de datos.

USE Northwind;
GO

SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c
INNER JOIN OPENROWSET(
        'Microsoft.Jet.OLEDB.4.0',
        'C:\Program Files\Microsoft Office\OFFICE11\SAMPLES\Northwind.mdb';'admin';'',
        Orders) AS o
    ON c.CustomerID = o.CustomerID;