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

为何此含OPENROWSET的T-SQL查询在Synapse中无法执行?

解决Synapse中OPENROWSET语法错误的问题

我之前在Synapse里测试读取Parquet文件时也碰到过一模一样的错误,大概率是环境配置或者语法使用场景不对导致的,下面给你几个排查和解决的方向:

1. 确认你使用的是Synapse Serverless SQL Pool

OPENROWSET直接读取Parquet的语法只支持Serverless SQL Pool,如果你用的是Dedicated SQL Pool(专用池),默认是不能这么写的,会触发语法错误。这种情况下你需要改用外部表+外部数据源的方式来读取(后面会给示例)。

2. 检查Serverless SQL Pool的配置(如果已经用了Serverless)

如果确定是Serverless池,那可能是数据库的配置没开启相关支持:

  • 首先检查数据库兼容级别,需要是150或更高:
    SELECT compatibility_level FROM sys.databases WHERE name = '<你的数据库名>';
    
    如果低于150,执行以下语句修改:
    ALTER DATABASE <你的数据库名> SET COMPATIBILITY_LEVEL = 150;
    
  • 启用Ad Hoc分布式查询(部分环境可能默认没开):
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    sp_configure 'Ad Hoc Distributed Queries', 1;
    RECONFIGURE;
    

3. 修正OPENROWSET的语法细节

确保你的语句格式正确,尤其是存储路径和认证部分:

  • 路径必须是Azure存储的完整URL(Blob Storage或ADLS Gen2),比如:
    https://<存储账户名>.blob.core.windows.net/<容器名>/<文件路径>.parquet
  • 如果存储需要认证(非公开容器),要加上CREDENTIAL参数,比如用托管身份或SAS密钥:

正确的Serverless示例语句:

SELECT TOP 100 *
FROM OPENROWSET(
    BULK 'https://yourstorageaccount.blob.core.windows.net/yourcontainer/files/sample.parquet',
    FORMAT='PARQUET',
    CREDENTIAL=(IDENTITY='Managed Identity') -- 用托管身份认证,换成你的实际认证方式
) AS [result]

4. 如果你用的是Dedicated SQL Pool的替代方案

专用池不能直接用OPENROWSET读Parquet,得通过外部表来实现,步骤如下:

-- 1. 创建数据库主密钥(首次操作需要)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'YourStrongPassword123!';

-- 2. 创建数据库范围凭据(这里用SAS密钥为例)
CREATE DATABASE SCOPED CREDENTIAL StorageSASCredential
WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
SECRET = 'sv=2022-11-02&ss=b&srt=sco&sp=rl&se=2025-01-01T00:00:00Z&st=2023-01-01T00:00:00Z&spr=https&sig=YourSASTokenHere';

-- 3. 创建外部数据源
CREATE EXTERNAL DATA SOURCE ParquetStorage
WITH (
    LOCATION = 'https://yourstorageaccount.blob.core.windows.net/yourcontainer',
    CREDENTIAL = StorageSASCredential
);

-- 4. 创建Parquet文件格式
CREATE EXTERNAL FILE FORMAT ParquetFormat
WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);

-- 5. 创建外部表(列要和Parquet文件的结构匹配)
CREATE EXTERNAL TABLE dbo.SampleParquetData (
    Id INT,
    ProductName VARCHAR(100),
    CreateDate DATETIME2
)
WITH (
    LOCATION = 'files/sample.parquet',
    DATA_SOURCE = ParquetStorage,
    FILE_FORMAT = ParquetFormat
);

-- 6. 查询外部表
SELECT TOP 100 * FROM dbo.SampleParquetData;

按照上面的步骤排查,应该能解决这个语法错误问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:23:13