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

如何在Azure Synapse无服务器SQL池用TSQL创建提取JSON键值的外部表

在Azure Synapse Analytics无服务器SQL池中创建employee外部表的TSQL实现

实现思路

原companyDetail外部表的employeeInfo列是非标准JSON格式(键名、字符串值无双引号),需先转换为标准JSON格式,再通过OPENJSON解析为键值对,最后使用CETAS(Create External Table As Select)语法创建目标外部表并落地数据。

前提准备

确保已配置好:

  • 用于存储结果的外部数据源(可复用现有数据源或新建)
  • 对应的文件格式(示例使用Parquet格式,可按需调整)

具体TSQL代码

1. (可选)创建结果存储用的外部数据源

若已有合适的数据源可跳过此步骤:

CREATE EXTERNAL DATA SOURCE employee_datasource
WITH (
    LOCATION = 'https://<你的存储账户名>.dfs.core.windows.net/<容器名>/employee_results/',
    TYPE = HADOOP
);

2. (可选)创建Parquet文件格式

若已有Parquet格式配置可跳过此步骤:

CREATE EXTERNAL FILE FORMAT parquet_format
WITH (
    FORMAT_TYPE = PARQUET,
    DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);

3. 创建employee外部表

CREATE EXTERNAL TABLE employee
WITH (
    LOCATION = 'employee_results/',
    DATA_SOURCE = employee_datasource,
    FILE_FORMAT = parquet_format
)
AS
SELECT
    cd.companyName,
    ISNULL(j.[key], '') AS employeeKey,
    ISNULL(j.value, '') AS employeeValue
FROM companyDetail cd
OUTER APPLY (
    SELECT [key], value
    FROM OPENJSON(
        -- 将非标准JSON转换为标准格式,兼容空值场景
        CASE 
            WHEN cd.employeeInfo IS NULL OR cd.employeeInfo = '' THEN '{}'
            ELSE '{"' + REPLACE(REPLACE(TRIM(cd.employeeInfo), ': ', '": "'), ', ', '", "') + '"}'
        END
    )
) j;

代码说明

  • JSON格式转换:通过REPLACE函数给非标准JSON的键名、字符串值添加双引号,转换为OPENJSON可识别的标准格式;空值/空字符串替换为{}避免解析报错。
  • OUTER APPLY:保证employeeInfo为空时,仍能保留对应行(键值列为空)。
  • CETAS:直接将查询结果写入指定存储路径,同时创建外部表指向该路径,适配无服务器SQL池的使用场景。

验证结果

执行以下查询查看最终数据:

SELECT * FROM employee;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 04:02:37