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

9

我正试图在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 ] ]  
)  
[;]  

需要一个文件格式。以下是另一个微软页面的语法:
``````
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,级别 15,状态 1,第 3 行
“EXTERNAL” 附近语法不正确。


这里也有同样的问题。 - Nick.McDermaid
这里也有同样的问题。微软总是让我惊讶,他们居然能够把一个如此糟糕、毫无用处的东西打包出售。为什么要首先发布它呢? - Contango
1个回答

11

你好,

CREATE EXTERNAL FILE FORMAT 是基于 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

您可能会收到一个错误信息:"Incorrect syntax near BLOB_STORAGE"。这是SSMS解析器的问题,而不是查询的问题。您可以在SOS中执行相同的查询,而不是在SSMS中执行。由于某些原因,在使用Azure SQL Database时,此查询在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 Query Service for External Data"

  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://learn.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

就这样了 :-)

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

我希望这对你有用 :-)


4
也许还需要运行以下命令: EXEC sp_configure 'polybase enabled', 1; RECONFIGURE; - smarcantonio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接