You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Synapse专用SQL池使用OPENROWSET报错,无服务器池可正常运行

专用SQL池使用OPENROWSET报错的原因及解决方案

错误原因

专用SQL池(Dedicated SQL Pool)不支持直接使用OPENROWSET(BULK...)语法查询外部存储数据,这个语法是无服务器SQL池(Serverless SQL Pool)的专属特性,因此在专用池执行会触发语法错误。

解决方案:通过PolyBase创建外部表查询ADLS Gen2

专用SQL池需要借助PolyBase创建外部对象来访问Azure Data Lake Storage Gen2的Parquet数据,具体步骤如下:

  1. 创建数据库主密钥(若未创建过)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword123!';
  1. 创建数据库范围凭据(以SAS密钥为例,也可使用托管身份)
CREATE DATABASE SCOPED CREDENTIAL ADLSGen2Credential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'YourSASKey'; -- 替换为你的存储账户SAS密钥,注意不要包含开头的"?"
  1. 创建外部数据源
CREATE EXTERNAL DATA SOURCE ADLSGen2DataSource
WITH (
    LOCATION = 'abfss://taxi@bidi65.dfs.core.windows.net/raw/trip_data_green_parquet/',
    CREDENTIAL = ADLSGen2Credential,
    TYPE = HADOOP
);
  1. 创建Parquet格式的外部文件格式
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
  1. 创建外部表(匹配Parquet数据结构,包含分区列)
CREATE EXTERNAL TABLE dbo.GreenTaxiData (
    VendorID INT,
    lpep_pickup_datetime DATETIME2(7)
)
WITH (
    LOCATION = 'year=*/month=*', -- 指向分区路径
    DATA_SOURCE = ADLSGen2DataSource,
    FILE_FORMAT = ParquetFileFormat
);
  1. 查询外部表并获取文件名
    专用SQL池无法直接用filename()函数,需关联sys.external_files系统视图获取文件名:
SELECT TOP 100
    gtd.*,
    ef.file_name
FROM dbo.GreenTaxiData gtd
JOIN sys.external_files ef
    ON ef.file_path LIKE CONCAT('%year=', gtd.$PARTITION.year, '/month=', gtd.$PARTITION.month, '%')
ORDER BY gtd.lpep_pickup_datetime;

托管身份替代方案

若不想使用SAS密钥,可给专用SQL池的托管身份分配ADLS Gen2的Blob数据贡献者权限,然后修改凭据创建语句:

CREATE DATABASE SCOPED CREDENTIAL ADLSGen2Credential
WITH IDENTITY = 'Managed Service Identity';

内容的提问来源于stack exchange,提问作者HamidBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:17:28