欢迎光临葬花网
详情描述

OPENJSONWITH 子句解析 JSON 数据的详细示例:

1. 基础示例 - 简单对象解析

-- 示例 JSON
DECLARE @json NVARCHAR(MAX) = N'{
    "id": 1,
    "name": "张三",
    "age": 30,
    "active": true
}';

-- 使用 OPENJSON + WITH 解析
SELECT *
FROM OPENJSON(@json)
WITH (
    id INT '$.id',
    name NVARCHAR(50) '$.name',
    age INT '$.age',
    active BIT '$.active'
);

2. 嵌套对象解析

DECLARE @json NVARCHAR(MAX) = N'{
    "userId": 100,
    "userInfo": {
        "firstName": "李",
        "lastName": "四",
        "email": "lisi@example.com"
    },
    "registrationDate": "2024-01-15"
}';

-- 解析嵌套对象
SELECT *
FROM OPENJSON(@json)
WITH (
    userId INT '$.userId',
    firstName NVARCHAR(50) '$.userInfo.firstName',
    lastName NVARCHAR(50) '$.userInfo.lastName',
    email NVARCHAR(100) '$.userInfo.email',
    regDate DATE '$.registrationDate'
);

3. 数组解析

3.1 基本数组

DECLARE @json NVARCHAR(MAX) = N'[
    {"id": 1, "product": "苹果", "price": 5.5},
    {"id": 2, "product": "香蕉", "price": 3.2},
    {"id": 3, "product": "橙子", "price": 4.8}
]';

-- 解析 JSON 数组
SELECT *
FROM OPENJSON(@json)
WITH (
    id INT '$.id',
    product NVARCHAR(50) '$.product',
    price DECIMAL(10,2) '$.price'
);

3.2 嵌套数组

DECLARE @json NVARCHAR(MAX) = N'{
    "orderId": "ORD001",
    "items": [
        {"productId": 101, "quantity": 2, "unitPrice": 25.50},
        {"productId": 205, "quantity": 1, "unitPrice": 120.00},
        {"productId": 309, "quantity": 3, "unitPrice": 15.75}
    ]
}';

-- 使用 CROSS APPLY 解析嵌套数组
SELECT 
    o.orderId,
    i.*
FROM OPENJSON(@json)
WITH (
    orderId NVARCHAR(20) '$.orderId',
    items NVARCHAR(MAX) '$.items' AS JSON
) AS o
CROSS APPLY OPENJSON(o.items)
WITH (
    productId INT '$.productId',
    quantity INT '$.quantity',
    unitPrice DECIMAL(10,2) '$.unitPrice'
) AS i;

4. 复杂结构解析

DECLARE @json NVARCHAR(MAX) = N'{
    "department": "技术部",
    "employees": [
        {
            "empId": 1001,
            "name": "王五",
            "skills": ["C#", "SQL", "JavaScript"],
            "projects": [
                {"name": "项目A", "role": "开发"},
                {"name": "项目B", "role": "测试"}
            ]
        },
        {
            "empId": 1002,
            "name": "赵六",
            "skills": ["Python", "Java"],
            "projects": [
                {"name": "项目C", "role": "架构师"}
            ]
        }
    ]
}';

-- 多级解析
SELECT 
    d.department,
    e.empId,
    e.name,
    s.skill,
    p.projectName,
    p.role
FROM OPENJSON(@json)
WITH (
    department NVARCHAR(50) '$.department',
    employees NVARCHAR(MAX) '$.employees' AS JSON
) AS d
CROSS APPLY OPENJSON(d.employees)
WITH (
    empId INT '$.empId',
    name NVARCHAR(50) '$.name',
    skills NVARCHAR(MAX) '$.skills' AS JSON,
    projects NVARCHAR(MAX) '$.projects' AS JSON
) AS e
CROSS APPLY OPENJSON(e.skills) s
CROSS APPLY OPENJSON(e.projects)
WITH (
    projectName NVARCHAR(100) '$.name',
    role NVARCHAR(50) '$.role'
) p;

5. 实际应用示例

5.1 从表中解析 JSON 列

-- 创建测试表
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    OrderData NVARCHAR(MAX)
);

-- 插入测试数据
INSERT INTO Orders VALUES
(1, '{"orderNo":"2024001","customer":"张三","totalAmount":1500.50}'),
(2, '{"orderNo":"2024002","customer":"李四","totalAmount":2300.00}');

-- 查询并解析 JSON 列
SELECT 
    o.OrderId,
    j.orderNo,
    j.customer,
    j.totalAmount
FROM Orders o
CROSS APPLY OPENJSON(o.OrderData)
WITH (
    orderNo NVARCHAR(20) '$.orderNo',
    customer NVARCHAR(50) '$.customer',
    totalAmount DECIMAL(10,2) '$.totalAmount'
) AS j;

5.2 处理可能缺失的字段

DECLARE @json NVARCHAR(MAX) = N'{
    "id": 1,
    "name": "测试产品",
    "price": 99.9
    -- 注意:description 字段缺失
}';

-- 使用宽松路径模式(SQL Server 2016+)
SELECT *
FROM OPENJSON(@json)
WITH (
    id INT,
    name NVARCHAR(100),
    price DECIMAL(10,2),
    description NVARCHAR(500) '$.description'  -- 缺失字段返回 NULL
);

6. 高级技巧

6.1 动态列名

DECLARE @json NVARCHAR(MAX) = N'{
    "metadata": {
        "createdBy": "admin",
        "createdAt": "2024-01-20T10:30:00"
    },
    "data": {
        "column1": "值1",
        "column2": 100,
        "column3": true
    }
}';

-- 解析动态属性
SELECT *
FROM OPENJSON(@json, '$.data');

6.2 路径表达式示例

DECLARE @json NVARCHAR(MAX) = N'{
    "store": {
        "books": [
            {"title": "SQL 指南", "author": "作者A"},
            {"title": "JSON 手册", "author": "作者B"}
        ],
        "location": "北京"
    }
}';

-- 不同路径表达式
SELECT *
FROM OPENJSON(@json, '$.store.books[0]');  -- 第一本书

SELECT *
FROM OPENJSON(@json, '$.store.books')  -- 所有书
WITH (
    title NVARCHAR(100) '$.title',
    author NVARCHAR(50) '$.author'
);

7. 性能优化提示

使用适当的数据类型:准确指定列的数据类型,避免隐式转换 路径表达式优化:尽量使用直接路径,避免复杂表达式 索引 JSON 列:对经常查询的 JSON 路径创建计算列和索引 仅选择需要的列:避免使用 SELECT *,只选择必要的列

8. SQL Server 版本要求

  • SQL Server 2016+:支持 OPENJSON(需要兼容级别 130 或更高)
  • JSON 函数:还需要安装 JSON 支持组件

这些示例涵盖了 SQL Server 中 OPENJSON + WITH 的主要用法场景。

相关帖子
惠州市java开源商城二次开发#SEO推广,小程序开发
惠州市java开源商城二次开发#SEO推广,小程序开发
惠州市正规殡葬服务|丧葬服务公司,白事悼念会服务
惠州市正规殡葬服务|丧葬服务公司,白事悼念会服务
线上缴费渠道全面普及,2026年通过手机App缴纳城乡居民医保具体如何操作?
线上缴费渠道全面普及,2026年通过手机App缴纳城乡居民医保具体如何操作?
什么是 Linux Mint? 适合初学者体验的桌面操作系统
什么是 Linux Mint? 适合初学者体验的桌面操作系统
惠州市殡葬热线|白事一条龙服务,殡葬追悼会布置
惠州市殡葬热线|白事一条龙服务,殡葬追悼会布置
当我们谈论“以旧换新”时,是否无意中助长了过度消费和资源浪费的循环?
当我们谈论“以旧换新”时,是否无意中助长了过度消费和资源浪费的循环?
乐山市殡葬服务一条龙办理-殡葬追思会服务,有竞争力的价格
乐山市殡葬服务一条龙办理-殡葬追思会服务,有竞争力的价格
有哪些容易被忽略的PPT操作技巧,能极大提升你的制作速度?
有哪些容易被忽略的PPT操作技巧,能极大提升你的制作速度?
2026年新型隔代育儿补贴形式探索,除现金外还有哪些支持服务?
2026年新型隔代育儿补贴形式探索,除现金外还有哪些支持服务?
如何在家庭与社区中普及祭祀用火的安全知识,有效预防火灾发生?
如何在家庭与社区中普及祭祀用火的安全知识,有效预防火灾发生?
除了查看日期,还有哪些可靠的感官指标能帮助我们判断食物安全性?
除了查看日期,还有哪些可靠的感官指标能帮助我们判断食物安全性?
济宁市殡葬一站式服务|办理白事服务,殡仪殡葬灵堂
济宁市殡葬一站式服务|办理白事服务,殡仪殡葬灵堂
烟台市精准获客@独立网站建设,价格透明
烟台市精准获客@独立网站建设,价格透明
安庆市专业网站建设#安卓app开发,服务可靠
安庆市专业网站建设#安卓app开发,服务可靠
购买不同品牌的新能源汽车,其合作的充电网络费用是否存在明显差别?
购买不同品牌的新能源汽车,其合作的充电网络费用是否存在明显差别?
自贡市办理白事服务-火化入盒,价格合理
自贡市办理白事服务-火化入盒,价格合理
零工工作者在提供服务过程中受伤或发生意外,责任认定与保障机制是怎样的?
零工工作者在提供服务过程中受伤或发生意外,责任认定与保障机制是怎样的?
黄冈市短视频运营推广@企业网站建设公司,收费透明
黄冈市短视频运营推广@企业网站建设公司,收费透明
淄博市殡葬一条龙公司|白事一站式服务,葬礼吊唁
淄博市殡葬一条龙公司|白事一站式服务,葬礼吊唁
黔南品牌网站开发设计#手机app开发,一站式建站服务
黔南品牌网站开发设计#手机app开发,一站式建站服务