分享方式:


sp_data_source_objects (Transact-SQL)

適用於:SQL Server 2019 (15.x)

傳回可供虛擬化的資料表物件清單。

Syntax

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' ]
[ ; ]

引數

[ @data_source = ] 'data_source'

要從中取得中繼資料的外部資料來源名稱。 @data_sourcesysname

[ @object_root_name = ] 'object_root_name'

此參數是要搜尋之物件名稱的根。 @object_root_namenvarchar(max),預設值為 NULL

此呼叫只會傳回開頭值設定為 @object_root_name 的外部物件。

如果 ODBC 資料來源連線到使用三部分名稱的關聯式資料庫管理系統 (RDBMS),則 @object_root_name 不能包含部分資料庫名稱。 在這些情況下,@object_root_name 參數應該包含這三個部分,第三個部分是要搜尋的物件名稱。

警告

由於外部資料平台之間的差異,某些平台在提供 NULL 預設值時不會傳回任何結果。 有些會將 NULL 視為缺少篩選條件。 例如,如果針對 @object_root_name 提供 NULL,則 Oracle RDMBS 將不會傳回結果。

[ @max_search_depth = ] max_search_depth

這個值會指定通過我們想要搜尋之 @object_root_name 的最大深度 (部分)。 @max_search_depthint,預設值為 1

例如,@max_search_depth 為 1,其中 @object_root_name 為 SQL Server 資料庫的名稱,會傳回資料庫中所包含的 schemata。

在目錄或結構描述的情況下,@max_search_depthNULL 時,會傳回關於 @object_root_name 是否存在且非空白的資訊。

[ @search_options = ] 'search_options'

search_options 參數是預設值為 NULL 的 Nvarchar(MAX)。

此參數未使用,但未來可能實作。

結果集

資料行名稱 資料類型 描述
OBJECT_TYPE nvarchar(200) 物件類型 (範例:TABLE 或 DATABASE)。
OBJECT_NAME nvarchar(max) 物件的完整名稱。 使用後端特定的引號字元逸出。
OBJECT_LEAF_NAME nvarchar(max) 不完整的物件名稱。
TABLE_LOCATION nvarchar(max) 可用於 CREATE EXTERNAL TABLE 陳述式的有效資料表位置字串。 如果不適用,則為 NULL

權限

要求 ALTER ANY EXTERNAL DATA SOURCE 權限。

備註

SQL Server 執行個體必須已安裝 PolyBase 功能。 此程序最初是在 SQL Server 2019 CU5 中引進。

此預存程序支援下列專案的連接器:

  • SQL Server
  • Oracle
  • Teradata
  • MongoDB
  • Azure Cosmos DB

此預存程式不支援一般 ODBC 資料來源或 Hadoop 連接器。

空白與非空白的概念與 ODBC 驅動程式和 SQLTables函式的行為有關。 非空白表示物件包含資料表,而非資料列。 例如,空白的結構描述不包含 SQL Server 中的資料表。 空白的資料庫表示 Teradata 內沒有資料表。

物件類型是由外部資料來源的 ODBC 驅動程式所決定。 每個外部資料來源都會決定哪些符合為資料表。 這可以包含資料庫物件,例如 Teradata 中的函式,或 Oracle 中的同義字。 PolyBase 無法連線到某些 ODBC 物件做為外部資料表,因此在 TABLE_LOCATION 資料行中沒有值。 雖然 TABLE_LOCATION 中沒有值,但是存在其中一個 ODBC 物件可能會讓資料庫或結構描述變成非空白。

使用 sp_data_source_objectssp_data_source_table_columns 來探索外部物件。 這些系統預存程序會傳回可供虛擬化的資料表結構描述。 Azure Data Studio 會使用這兩個預存程序來支援資料虛擬化。 使用 sp_data_source_table_columns 來探索 SQL Server 資料類型中所表示的外部資料表結構描述。

包含陣列之 MongoDB 集合的外部資料表

若要建立包含陣列之 MongoDB 集合的外部資料表,您應該使用適用於 Azure Data Studio 的資料虛擬化延伸模組,根據 PolyBase ODBC Driver for MongoDB 偵測到的結構描述來產生 CREATE EXTERNAL TABLE 陳述式。 驅動程式會自動執行壓平合併動作。 或者,您可以使用 sp_data_source_objects 來偵測集合結構描述 (資料行),並手動建立外部資料表。 sp_data_source_table_columns 預存程序也會透過 PolyBase ODBC Driver for MongoDB 驅動程式自動執行壓平合併。 Azure Data Studio 和 sp_data_source_table_columns 的資料虛擬化延伸模組使用相同的內部預存程序來查詢外部結構描述。

資料來源類型特定備註

  • Teradata

    Teradata 系統檢視不會使用資料列層級安全性 (RLS),因此使用者可以看到其無法查詢的資料表是否存在。

  • MongoDB

    某些舊版 MongoDB 會限制將所有資料庫列出給類似系統管理員的使用者。 沒有此授權的使用者可能會收到嘗試以 Null @object_root_name 執行此程序的驗證錯誤。

  • Oracle

    搭配使用 PolyBase 時,不支援 Oracle 同義字。

範例

SQL Server

下列範例會傳回所有資料庫、schemata 和資料表/檢視

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]

下列範例會傳回所有資料庫

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

下列範例會傳回資料庫中的所有 schemata

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

下列範例會傳回結構描述中的所有資料表

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

下列範例會傳回完整的 schemata 和資料表、函式、檢視等等。

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

下列範例會傳回所有資料庫和資料表、函數、檢視等等。

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

下列範例會傳回所有資料庫和資料表。

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]