能否在Azure Synapse无服务器SQL池用T-SQL结合多源数据查询?
在Azure Synapse无服务器SQL池中合并查询DataLake Parquet与Azure SQL数据(无需复制表)
完全可以实现,无需预先复制Azure SQL的表到Synapse,直接通过T-SQL在同一脚本中完成两类数据源的合并查询。核心是通过**外部数据源(External Data Source)**连接Azure SQL数据库,再结合OPENROWSET读取Parquet数据进行关联。
步骤1:创建指向Azure SQL的外部数据源
首先在Synapse无服务器SQL池中创建外部数据源,用于连接你的Azure SQL数据库:
-- 若使用SQL身份验证,先创建数据库范围凭据 CREATE DATABASE SCOPED CREDENTIAL AzureSQL_Credential WITH IDENTITY = '<azure-sql-用户名>', SECRET = '<azure-sql-密码>'; -- 创建外部数据源 CREATE EXTERNAL DATA SOURCE AzureSQL_ExternalSource WITH ( LOCATION = 'sqlserver://<你的Azure SQL服务器名>.database.windows.net', CREDENTIAL = AzureSQL_Credential, -- 若用Azure AD托管身份访问,可省略此参数(需提前给托管身份授予Azure SQL的db_datareader角色) TYPE = RDBMS );
步骤2:合并查询Parquet与Azure SQL数据
直接在同一查询中,用OPENROWSET读取DataLake的Parquet文件,同时引用Azure SQL的表进行关联:
SELECT p.customer_id, p.order_amount, sql_c.customer_name, sql_c.customer_email FROM -- 读取DataLake中的Parquet文件 OPENROWSET( BULK 'https://<你的存储账户>.dfs.core.windows.net/<容器名>/orders/*.parquet', FORMAT = 'PARQUET' ) AS p INNER JOIN -- 直接引用Azure SQL中的表(四部分命名:外部数据源.数据库名.架构名.表名) AzureSQL_ExternalSource.<你的Azure SQL数据库名>.dbo.customers AS sql_c ON p.customer_id = sql_c.customer_id -- 可添加过滤、聚合等复杂逻辑 WHERE p.order_date >= '2024-01-01';
进阶:用OPENQUERY优化跨数据源查询
如果需要在Azure SQL端先执行复杂过滤/聚合(减少跨网络传输的数据量),可以用OPENQUERY:
SELECT p.order_id, p.order_amount, sql_filtered.customer_name FROM OPENROWSET( BULK 'https://<你的存储账户>.dfs.core.windows.net/<容器名>/orders/*.parquet', FORMAT = 'PARQUET' ) AS p JOIN OPENQUERY( AzureSQL_ExternalSource, 'SELECT customer_id, customer_name FROM dbo.customers WHERE region = ''North America''' ) AS sql_filtered ON p.customer_id = sql_filtered.customer_id;
关键注意事项
- 权限配置:确保Synapse无服务器SQL池的IP被加入Azure SQL的防火墙允许列表,或者使用Azure AD托管身份避免IP限制
- 性能优化:尽量在数据源端过滤数据(比如Parquet用路径分区过滤,Azure SQL用
OPENQUERY提前筛选),减少跨数据源的数据传输量 - 数据类型兼容性:注意Parquet和Azure SQL之间的数据类型映射,避免关联或查询时出现类型错误
内容的提问来源于stack exchange,提问作者Zoro4246
相关产品推荐
相关产品推荐

