1. 什么是外部表
在SQL Server数据库中,外部表是一种特殊的表,它不是存储在数据库中的,它是通过连接到外部数据源而创建出来的一种虚拟表。外部数据源可以是一个Excel文件、一个Access数据库、一个SQL Server数据库或者一个文本文件等等。外部表可以通过SQL语句对其进行访问和操作,与常规的内部表一样,可以进行Select、Insert、Update、Delete等操作。
2. 外部表的创建
2.1 使用SQL Server Management Studio(SSMS)创建外部表
在SSMS中,通过连接外部数据源,可以创建外部表。如下例子:创建一个连接到Excel文件的外部数据源tempDataSource。可以右击Server Objects,选择Linked Servers,然后在新的连接窗口中配置Excel的数据源,连接Excel文件即可。
EXEC master.dbo.sp_addlinkedserver @server = N'tempDataSource',
@srvproduct=N'Excel',
@provider=N'Microsoft.ACE.OLEDB.12.0',
@datasrc=N'C:\temp\test.xlsx',
@provstr=N'Excel 12.0 Xml'
GO
接着,在SSMS的Database上,右击New Query,选择‘New Query with Current Connection’,就会打开新的查询窗口。创建一个新的外部表tempTable,连接指向刚才创建的外部数据源tempDataSource。
CREATE EXTERNAL TABLE [dbo].[tempTable](
[ID] [nvarchar](50) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Age] [int] NOT NULL,
[Email] [nvarchar](50) NOT NULL
) WITH (
DATA_SOURCE = tempDataSource,
SCHEMA_NAME = N'dbo',
OBJECT_NAME = N'test$'
)
在这个例子中,外部数据源连接到的是一个Excel文件test.xlsx,并在Excel文件中创建了一个Sheet1表。
2.2 使用T-SQL语句创建外部表
可以使用CREATE EXTERNAL DATA SOURCE指令和CREATE EXTERNAL TABLE指令来创建外部表。
CREATE EXTERNAL DATA SOURCE用于定义一个连接到外部数据源的数据源名称和连接信息。语法如下:
CREATE EXTERNAL DATA SOURCE data_source_name WITH (
TYPE = type_name,
LOCATION = 'location',
CREDENTIAL = credential_name_or_external_provider
)
其中类型(type_name)取决于数据源类型,例如 SQL Server数据源应指定为 RDBMS。位置(location)取决于特定数据源的连接信息。凭据(credential)指定用于连接到外部数据源的凭据。例如,对于Azure Blob Storage数据源,它应该是一个有效的Azure存储账户凭据。
CREATE EXTERNAL TABLE用于创建外部表。语法如下:
CREATE EXTERNAL TABLE [ schema_name . ] table_name
( [ ,...n ] )
WITH
( DATA_SOURCE = ,
[ ]
)
其中,column_definition用于定义外部表的列和数据类型,data_source_name是外部数据源的名称,file_format_options表示数据源的格式,例如在使用Azure Blob Storage创建外部表的情况下,应该指定文件的文件类型、分隔符、封闭字符等信息。
3. 外部表的使用
3.1 查询外部表数据
可以使用SELECT语句对外部表进行查询。外部表查询需要与数据源交互,性能与数据源的规模、连接属性等有关。下面是一个例子,从一个存在于Azure Blob Storage上的csv文件的外部表系统中查询数据。
SELECT * FROM [dbo].[test_csv_external_tbl];
在这个例子中,外部表的名称是test_csv_external_tbl。如果您的数据源存在于Azure Blob Storage上,数据外部表是使用类似如下的SQL Server命令进行创建的:
CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH ( TYPE = BLOB_STORAGE,
LOCATION = 'https://mystorageaccount.blob.core.windows.net',
CREDENTIAL= ****)
GO
CREATE EXTERNAL FILE FORMAT csv_format WITH (FORMAT_TYPE = DELIMITED,FORMAT_OPTIONS (FIELD_TERMINATOR = ',', STRING_DELIMITER='"', FIRST_ROW = 2,DATE_FORMAT = 'yyyy-MM-dd'))
GO
CREATE EXTERNAL TABLE [dbo].[test_csv_external_tbl]
(
[ID] [INT] NOT NULL,
[Name] [NVARCHAR](50) NOT NULL,
[Age] [INT] NOT NULL,
[Email] [NVARCHAR](50) NOT NULL
)
WITH
(
LOCATION='mycontainer/myfile.csv'
, DATA_SOURCE=MyAzureBlobStorage
, FILE_FORMAT = csv_format
, REJECT_TYPE = value
, REJECT_VALUE = 0
);
3.2 更新外部表数据
在许多情况下,外部表充当一个只读表,更新需要在外部数据源中进行。但是,可以使用T-SQL对外部表进行更新,并将更新传递回数据源。例如:
UPDATE [dbo].[test_csv_external_tbl]
SET [Age] = [Age] + 1
WHERE [Name] = 'John'
在这个例子中,更新的查询发生在SQL Server实例中,但客户端处理的所有数据被传递回,以在一个独立的操作中更新同一数据源中的数据。
3.3 删除外部表数据
可以使用DELETE语句从外部表删除数据。在这种情况下,删除操作将传递回外部数据源。
DELETE [dbo].[test_csv_external_tbl]
WHERE [Name] = 'John'
3.4 插入外部表数据
可以使用INSERT语句将数据插入到外部表。数据将通过批量加载将插入到外部数据源中。例如:
INSERT INTO [dbo].[test_csv_external_tbl] ([ID], [Name], [Age], [Email])
VALUES (1, 'Mike', 25, 'mike@gmail.com'),
(2, 'Tom', 28, 'tom@gmail.com')
在这里,将向外部表test_csv_external_tbl中添加两个记录。数据将在INSERT INTO语句执行时直接插入到连接到的外部数据源中。
4. 总结
外部表是SQL Server数据库中的一种特殊表,它通过连接到外部数据源来创建。可以通过T-SQL语句操作这个外部表以及它所连接的数据源。具体操作包括查询、更新、删除、插入等。外部表使用方便灵活,可以轻松连接到不同的数据源以简化复杂的数据处理工作。