如何修改Azure Synapse SQL查询以将结果写入Azure Blob存储?
实现Azure Synapse SQL查询结果写入Blob存储
要将SQL查询结果写回Azure Blob存储,你可以使用Synapse SQL支持的CETAS(CREATE EXTERNAL TABLE AS SELECT)或COPY INTO语句,以下是具体实现步骤:
前置准备:配置外部依赖(CETAS需要)
如果使用CETAS,需先创建指向Blob存储的外部数据源和对应的文件格式:
-- 创建数据库范围凭据(替换为你的存储账户信息) CREATE DATABASE SCOPED CREDENTIAL BlobStorageCredential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '你的SAS令牌'; -- 也可使用存储账户密钥:IDENTITY = '存储账户名', SECRET = '存储账户密钥' -- 创建外部数据源 CREATE EXTERNAL DATA SOURCE BlobStorageSource WITH ( LOCATION = 'https://myblob.blob.core.windows.net/testblob/', CREDENTIAL = BlobStorageCredential ); -- 创建CSV格式的外部文件格式 CREATE EXTERNAL FILE FORMAT CsvFileFormat WITH ( FORMAT_TYPE = DELIMITEDTEXT, FORMAT_OPTIONS ( FIELD_TERMINATOR = ',', STRING_DELIMITER = '"', FIRST_ROW = 2, USE_TYPE_DEFAULT = TRUE ) );
方法1:使用CETAS写入Blob存储
CETAS会将查询结果以外部表的形式存储到Blob指定路径,适合需要后续复用结果的场景:
CREATE EXTERNAL TABLE callconfigQueryResult WITH ( LOCATION = 'query_output/', -- Blob中存储结果的子路径,会自动创建 DATA_SOURCE = BlobStorageSource, FILE_FORMAT = CsvFileFormat ) AS -- 复用你已有的查询语句 SELECT * FROM OPENROWSET(BULK 'https://myblob.blob.core.windows.net/testblob/', FORMAT = 'CSV') WITH ( date1 DATETIME2, media varchar(8000), callconfig VARCHAR(8000), count1 INT ) AS [callconfigTable];
方法2:使用COPY INTO直接导出结果
如果不需要创建外部表,仅需将查询结果导出为Blob文件,使用COPY INTO更直接:
COPY INTO 'https://myblob.blob.core.windows.net/testblob/query_output/' -- Blob输出路径 FROM ( -- 复用你的查询语句 SELECT * FROM OPENROWSET(BULK 'https://myblob.blob.core.windows.net/testblob/', FORMAT = 'CSV') WITH ( date1 DATETIME2, media varchar(8000), callconfig VARCHAR(8000), count1 INT ) AS [callconfigTable] ) WITH ( FILE_TYPE = 'CSV', FIELD_TERMINATOR = ',', STRING_DELIMITER = '"', CREDENTIAL = BlobStorageCredential, -- 对应前面创建的凭据 HEADER = 'ON' -- 导出时包含表头,不需要则设为OFF );
关键注意事项
- 确保Synapse工作区对目标Blob存储有读写权限,可通过存储账户防火墙规则允许Synapse访问,或使用SAS令牌/存储密钥授权
- 两种方式都会根据数据量自动生成多个文件,避免单文件过大
- 如果使用存储账户密钥创建凭据,需确保密钥拥有足够的存储权限
内容的提问来源于stack exchange,提问作者Groot
相关产品推荐
相关产品推荐

