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数据,具体步骤如下:
- 创建数据库主密钥(若未创建过)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword123!';
- 创建数据库范围凭据(以SAS密钥为例,也可使用托管身份)
CREATE DATABASE SCOPED CREDENTIAL ADLSGen2Credential WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = 'YourSASKey'; -- 替换为你的存储账户SAS密钥,注意不要包含开头的"?"
- 创建外部数据源
CREATE EXTERNAL DATA SOURCE ADLSGen2DataSource WITH ( LOCATION = 'abfss://taxi@bidi65.dfs.core.windows.net/raw/trip_data_green_parquet/', CREDENTIAL = ADLSGen2Credential, TYPE = HADOOP );
- 创建Parquet格式的外部文件格式
CREATE EXTERNAL FILE FORMAT ParquetFileFormat WITH ( FORMAT_TYPE = PARQUET, DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec' );
- 创建外部表(匹配Parquet数据结构,包含分区列)
CREATE EXTERNAL TABLE dbo.GreenTaxiData ( VendorID INT, lpep_pickup_datetime DATETIME2(7) ) WITH ( LOCATION = 'year=*/month=*', -- 指向分区路径 DATA_SOURCE = ADLSGen2DataSource, FILE_FORMAT = ParquetFileFormat );
- 查询外部表并获取文件名
专用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
相关产品推荐
相关产品推荐

