如何在SQL Server中创建文件格式

时间:2017-12-02 01:06:12

标签: sql-server

我试图在SQL Server 2017中试验外部文件,并且在第一步遇到困难。

数据是管道分隔的,我尝试按照文档中的语法进行操作,这需要FILE_FORMAT

以下是每个Microsoft的语法:

CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] 
table_name   
( <column_definition> [ ,...n ] )  
WITH (   
    LOCATION = 'folder_or_filepath',  
    DATA_SOURCE = external_data_source_name,  
    FILE_FORMAT = external_file_format_name  
    [ , <reject_options> [ ,...n ] ]  
)  
[;]  

这需要file_format。

以下是另一个MS页面的语法:

CREATE EXTERNAL FILE FORMAT file_format_name  
WITH (  
FORMAT_TYPE = DELIMITEDTEXT  
[ , FORMAT_OPTIONS ( <format_options> [ ,...n  ] ) ]  
[ , DATA_COMPRESSION = {  
       'org.apache.hadoop.io.compress.GzipCodec'  
     | 'org.apache.hadoop.io.compress.DefaultCodec'  
    }  
 ]);  

以下是我编写的用于创建管道分隔文件的内容:

CREATE EXTERNAL FILE FORMAT psv
WITH (  
FORMAT_TYPE = DELIMITEDTEXT  
 , FORMAT_OPTIONS (FIELD_TERMINATOR = '|')   
);  

以下是错误消息:

  

Msg 102,Level 15,State 1,Line 3
  &#39; EXTERNAL&#39;附近的语法不正确。

1 个答案:

答案 0 :(得分:3)

美好的一天,

创建外部文件格式基于PolyBase ,这意味着您需要安装PolyBase并启用它。除非您这样做,否则您会收到此错误。

在下面的过程中,您可以看到无论PolyBase为何,都可以使用相关元素的一部分,而其他元素则需要更多步骤...让我们来看一下这个示例:

create database MyLocalDB;
GO

use MyLocalDB
GO

-- Creates a database master key.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'My!Simple@Pass#for$Lecture'  
GO

CREATE DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential 
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = '<enter you blob key here>';
GO

让我们在SSMS中创建外部数据源:

CREATE EXTERNAL DATA SOURCE MyAzureBlobStorage
WITH (
    TYPE = BLOB_STORAGE, 
    LOCATION = 'https://EnterYourBlobNameHere.blob.core.windows.net/invoices', 
    CREDENTIAL= MyAzureBlobStorageCredential
);
GO

您可能会收到错误:“ BLOB_STORAGE附近的语法不正确” 这是SSMS解析器的问题,而不是查询的问题。您可以从SOS而不是SSMS执行相同的查询。由于某些原因,当我们使用Azure SQL数据库时,它在SSMS中执行得很好。

SELECT * FROM sys.external_data_sources
GO

现在我们来解决您的问题

CREATE EXTERNAL FILE FORMAT myfileformat  
WITH (  
    FORMAT_TYPE = DELIMITEDTEXT,   
    FORMAT_OPTIONS (FIELD_TERMINATOR ='|')  
);
-- ERROR: Incorrect syntax near 'EXTERNAL'.

需要更多工作...

  1. 安装“ java运行时环境”(需要版本7及更高版本) https://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html

  2. 运行SQL Server安装并添加功能:“用于外部数据的PolyBase查询服务”

  3. 根据您使用的源使用sp_configure启用PolyBase源配置

最后一点,例如,暗示对于hadoop连接,您需要:

USE master;  
GO  
EXEC sp_configure 'show advanced option', '1';
RECONFIGURE;
GO
EXEC sp_configure 'hadoop connectivity', 1;
RECONFIGURE;
GO

有关这一点的更多信息,您可以获取官方文档:https://docs.microsoft.com/en-us/sql/database-engine/configure-windows/polybase-connectivity-configuration-transact-sql

确认已安装PolyBase:

SELECT SERVERPROPERTY ('IsPolybaseInstalled') AS IsPolybaseInstalled;
GO

尝试执行查询

CREATE EXTERNAL FILE FORMAT myfileformat  
WITH (  
    FORMAT_TYPE = DELIMITEDTEXT,   
    FORMAT_OPTIONS (FIELD_TERMINATOR ='|')  
);
-- ERROR: TCP Provider: No connection could be made because the target machine actively refused it.

如果出现上述错误,则:(1)使用SQL Server配置管理器启用TCP。 (2)确保PolyBase服务正在运行

CREATE EXTERNAL FILE FORMAT myfileformat  
WITH (  
    FORMAT_TYPE = DELIMITEDTEXT,   
    FORMAT_OPTIONS (FIELD_TERMINATOR ='|')  
);
-- OK

就这样:-)

您现在可以使用外部文件格式并创建外部表

我希望这是有用的:-)