sp_data_source_objects (Transact-SQL)
Se aplica a: SQL Server 2019 (15.x)
Devuelve la lista de objetos de tabla que están disponibles para virtualizarse.
Sintaxis
Convenciones de sintaxis de Transact-SQL
sp_data_source_objects
[ @data_source = ] 'data_source'
[ , [ @object_root_name = ] 'object_root_name' ]
[ , [ @max_search_depth = ] max_search_depth ]
[ , [ @search_options = ] 'search_options' ]
[ ; ]
Argumentos
[ @data_source = ] 'data_source'
Nombre del origen de datos externo del que se van a obtener los metadatos. @data_source es sysname
.
[ @object_root_name = ] 'object_root_name'
Este parámetro es la raíz del nombre de los objetos que se van a buscar. @object_root_name es nvarchar(max)
, con un valor predeterminado de NULL
.
Esta llamada solo devuelve objetos externos que comienzan con el valor establecido para @object_root_name.
Si un origen de datos ODBC se conecta a un sistema de administración de bases de datos relacionales (RDBMS) que usa nombres de tres partes, @object_root_name no puede contener un nombre de base de datos parcial. En estos casos, el parámetro @object_root_name debe contener las tres partes, siendo la tercera parte el nombre del objeto que se va a buscar.
Precaución
Debido a las diferencias entre las plataformas de datos externos, algunas no devuelven ningún resultado si se proporciona el valor predeterminado de NULL
. Algunos tratan NULL
como la falta de un filtro. Por ejemplo, RDMBS de Oracle no devolverá resultados si NULL
se proporciona para @object_root_name.
[ @max_search_depth = ] max_search_depth
Este valor especifica la profundidad máxima (en partes) pasada la @object_root_name que deseamos buscar. @max_search_depth es un valor int con un valor predeterminado de 1
.
Por ejemplo, un @max_search_depth de 1, con un @object_root_name que es el nombre de una base de datos de SQL Server, devolvería un esquema contenido dentro de la base de datos.
Un @max_search_depth de NULL
devuelve información sobre @object_root_name si existe y no está vacía, en el caso del catálogo o el esquema.
[ @search_options = ] 'search_options'
El parámetro search_options
es nvarchar(max) con un valor predeterminado de NULL
.
Este parámetro no se usa, pero puede implementarse en el futuro.
Conjunto de resultados
Nombre de la columna | Tipo de datos | Descripción |
---|---|---|
OBJECT_TYPE |
nvarchar(200) | Tipo del objeto (ejemplo: TABLE o DATABASE). |
OBJECT_NAME |
nvarchar(max) | Nombre completo del objeto. Se ha evadido con el carácter de comilla específico del back-end. |
OBJECT_LEAF_NAME |
nvarchar(max) | Nombre de objeto no calificado. |
TABLE_LOCATION |
nvarchar(max) | Cadena de ubicación de tabla válida que se podría usar para la instrucción CREATE EXTERNAL TABLE. Es NULL si no es aplicable. |
Permisos
Requiere el permiso ALTER ANY EXTERNAL DATA SOURCE.
Comentarios
Debe instalarse la característica PolyBase en la instancia de SQL Server. Este procedimiento se introdujo por primera vez en SQL Server 2019 CU5.
Este procedimiento almacenado admite conectores para:
- SQL Server
- Oracle
- Teradata
- MongoDB
- Azure Cosmos DB
El procedimiento almacenado no admite el origen de datos ODBC genérico ni los conectores de Hadoop.
La noción de vacío frente a no vacío se relaciona con el comportamiento del controlador ODBC y la función SQLTables. No vacío indica que un objeto contiene tablas, no filas. Por ejemplo, un esquema vacío no contiene tablas en SQL Server. Una base de datos vacía no contiene tablas dentro de Teradata.
Los tipos de objeto están determinados por el controlador ODBC del origen de datos externo. Cada origen de datos externo determina qué califica como una tabla. Esto puede incluir objetos de base de datos como funciones en Teradata o sinónimos de Oracle. PolyBase no puede conectarse a algunos objetos ODBC como tablas externas y, por tanto, no tendrá un valor en la columna TABLE_LOCATION
. A pesar de la ausencia de valores en TABLE_LOCATION
, la presencia de uno de estos objetos ODBC puede hacer que una base de datos o un esquema no estén vacíos.
Use sp_data_source_objects
y sp_data_source_table_columns para detectar objetos externos. Estos procedimientos almacenados del sistema devuelven el esquema de las tablas que están disponibles para virtualizarse. Azure Data Studio usa estos dos procedimientos almacenados para admitir la virtualización de datos. Use sp_data_source_table_columns para detectar esquemas de tablas externas representados en tipos de datos de SQL Server.
Tablas externas a colecciones de MongoDB que contienen matrices
Para crear tablas externas en colecciones de MongoDB que contienen matrices, debe usar la extensión de virtualización de datos para Azure Data Studio a fin de generar una instrucción CREATE EXTERNAL TABLE basada en el esquema que detecta el controlador ODBC de PolyBase para MongoDB. El controlador realiza automáticamente las acciones de acoplamiento. También puede usar sp_data_source_objects para detectar el esquema de colección (columnas) y crear manualmente la tabla externa. El procedimiento almacenado sp_data_source_table_columns
también realiza automáticamente el acoplamiento mediante el controlador ODBC de PolyBase para MongoDB. La extensión de virtualización de datos para Azure Data Studio y sp_data_source_table_columns
usa los mismos procedimientos almacenados internos a fin de consultar el esquema externo.
Comentarios específicos del tipo de origen de datos
Teradata
Las vistas del sistema de Teradata no usan la seguridad de nivel de fila (RLS), por lo que los usuarios pueden ver la existencia de tablas que no pueden consultar.
MongoDB
Algunas versiones anteriores de MongoDB restringen la capacidad de enumerar todas las bases de datos a usuarios de tipo administrador. Los usuarios sin este permiso pueden obtener errores de autenticación al intentar ejecutar este procedimiento con un @object_root_name null.
Oracle
Los sinónimos de Oracle no se admiten para su uso con PolyBase.
Ejemplos
SQL Server
En el ejemplo siguiente se devuelven todas las bases de datos, esquemas y vistas de tablas.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 3;
EXEC sp_data_source_objects @data_source,
@object_root_name,
@max_search_depth;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
DATABASE |
"database" |
database |
NULL |
SCHEMA |
"database"."dbo" |
dbo |
NULL |
TABLE |
"database"."dbo"."customer" |
customer |
[database].[dbo].[customer] |
TABLE |
"database"."dbo"."item" |
item |
[database].[dbo].[item] |
TABLE |
"database"."dbo"."nation" |
nation |
[database].[dbo].[nation] |
En el ejemplo siguiente se devuelven todas las bases de datos.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
DATABASE |
UserDatabase |
UserDatabase |
NULL |
DATABASE |
master |
master |
NULL |
DATABASE |
msdb |
msdb |
NULL |
DATABASE |
tempdb |
tempdb |
NULL |
DATABASE |
database |
database |
NULL |
En el ejemplo siguiente se devuelven todos los esquemas de una base de datos.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[database]';
EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
SCHEMA |
"database"."dbo" |
dbo |
NULL |
SCHEMA |
"database"."INFORMATION_SCHEMA" |
INFORMATION_SCHEMA |
NULL |
SCHEMA |
"database"."sys" |
sys |
NULL |
En el ejemplo siguiente se devuelven todas las tablas del esquema.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[database].[dbo]';
EXEC sp_data_source_objects @data_source, @object_root_name;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
TABLE |
"database"."dbo"."customer" |
customer |
[database].[dbo].[customer] |
TABLE |
"database"."dbo"."item" |
item |
[database].[dbo].[item] |
TABLE |
"database"."dbo"."nation" |
nation |
[database].[dbo].[nation] |
TABLE |
"database"."dbo"."orders" |
orders |
[database].[dbo].[orders] |
TABLE |
"database"."dbo"."part" |
part |
[database].[dbo].[part] |
Oracle
En el ejemplo siguiente se devuelven las tablas y esquemas completos, funciones, vistas, etc.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = N'[OracleObjectRoot]';
DECLARE @max_search_depth INT = 2;
EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
VIEW |
"SYS"."ALL_SQLSET_STATEMENTS" |
ALL_SQLSET_STATEMENTS |
[ORACLEOBJECTROOT].[SYS].[ALL_SQLSET_STATEMENTS] |
SYSTEM TABLE |
"SYS"."BOOTSTRAP$" |
BOOTSTRAP$ |
[ORACLEOBJECTROOT].[SYS].[BOOTSTRAP$] |
SYNONYM |
"PUBLIC"."ALL_ALL_TABLES" |
ALL_ALL_TABLES |
NULL |
SCHEMA |
"database" |
database |
NULL |
TABLE |
"database"."customer" |
customer |
[ORACLEOBJECTROOT].[database].[customer] |
Teradata
En el ejemplo siguiente se devuelven todas las bases de datos y tablas, funciones, vistas, etc.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 2;
EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
FUNCTION |
"SYSLIB"."ExtractRoles" |
ExtractRoles |
NULL |
SYSTEM TABLE |
"DBC"."UDTCast" |
UDTCast |
[DBC].[UDTCast] |
TYPE |
"SYSUDTLIB"."XML" |
XML |
NULL |
DATABASE |
"database" |
database |
NULL |
TABLE |
"database"."customer" |
customer |
[database].[customer] |
Mongo DB
En el ejemplo siguiente se devuelven todas las bases de datos y tablas.
DECLARE @data_source SYSNAME = N'ExternalDataSourceName';
DECLARE @object_root_name NVARCHAR(MAX) = NULL;
DECLARE @max_search_depth INT = 2;
EXEC sp_data_source_objects @data_source, @object_root_name, @max_search_depth;
Object_Type | OBJECT_NAME | OBJECT_LEAF_NAME | TABLE_LOCATION |
---|---|---|---|
DATABASE |
"database" |
database |
NULL |
TABLE |
"database"."customer" |
customer |
[database].[customer] |
TABLE |
"database"."item" |
item |
[database].[item] |
TABLE |
"database"."nation" |
nation |
[database].[nation] |
TABLE |
"database"."orders" |
orders |
[database].[orders] |