Json函数(Transact-SQL)适用于SQL Server2016(13.x)及更高版本,13.x以下的版本没有提供Json类型的格式化读取操作。
如果你本地的SQL Server数据库是2016 v13.x及以上版本,可直接参考如下链接的JSON函数:
此处利用Substring和CHARINDEX提供简单的截取方式解析Json数据,数据库是SQL Server 2014。
CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )
expressionToFind
一个字符表达式,其中包含要查找的序列。 expressionToFind 限制为 8000 个字符 。expressionToSearch
要搜索的字符表达式。start_location
表示搜索开始位置的 integer 或 bigint 表达式 。 如果 start_location 未指定、具有负数值或 0,搜索将从 expressionToSearch 的开头开始 。
SUBSTRING ( expression, start, length )
expression
为 character、binary、text、ntext 或者 image 表达式。start
指定返回字符的起始位置的整数或 bigint 表达式 。 (编号从 1 开始,意味着表达式中的第一个字符为 1)。 如果 start 小于 1,则返回的表达式的起始位置为表达式中指定的第一个字符 。 在这种情况下,返回的字符数是后两者中的较大值:start + length 之和减去 1,0。 如果 start 大于值表达式中的字符数,将返回一个零长度的表达式 。length
是正整数或用于指定要返回的 expression 的字符数的 bigint 表达式 。 如果 length 是负数,会生成错误并终止语句 。 如果 start 和 length 的总和大于表达式中的字符数,则会返回从 start 开始的整个值表达式 。
Json格式:
{"companyId":1,"creditAgreementIds":[4122],"startDate":"12/06/2024","endDate":"12/27/2024"}
数据表结构和数据初始化实例。
declare @TestJsonExtract table(Id int, JsonColumn nvarchar(max))
insert into @TestJsonExtract(Id,JsonColumn) values(1,'{"companyId":1,"creditAgreementIds":[4122],"startDate":"12/06/2024","endDate":"12/27/2024"}')
insert into @TestJsonExtract(Id,JsonColumn) values(2,'{"companyId":1,"creditAgreementIds":[4122,123456,7890],"startDate":"01/06/2025","endDate":"04/14/2025"}')
获取StartDate和EndDate
--定义Key
declare @StartDate varchar(50)='"startDate":"'
declare @EndDate varchar(50)='"endDate":"'
select
StartDate=CONVERT(DATETIME,SUBSTRING(JsonColumn,CHARINDEX(@StartDate,JsonColumn)+len(@StartDate),10))
,EndDate=CONVERT(DATETIME,SUBSTRING(JsonColumn,CHARINDEX(@EndDate,JsonColumn)+len(@EndDate),10))
,DayDiff=DATEDIFF(DAY
,CONVERT(DATETIME,SUBSTRING(JsonColumn,CHARINDEX(@StartDate,JsonColumn)+len(@StartDate),10))
,CONVERT(DATETIME,SUBSTRING(JsonColumn,CHARINDEX(@EndDate,JsonColumn)+len(@EndDate),10))
)
from @TestJsonExtract
输出结果:
StartDate | EndDate | DayDiff |
2024-12-06 00:00:00.000 | 2024-12-27 00:00:00.000 | 21 |
2025-01-06 00:00:00.000 | 2025-04-14 00:00:00.000 | 98 |