是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?
Posted
技术标签:
【中文标题】是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?【英文标题】:Is it possible to use wildcards as an argument for OPENJSON in SQL Server? 【发布时间】:2020-08-10 12:05:39 【问题描述】:我有一个嵌套的 JSON 数组,其中包含数字的外部键,每个键都包含我需要导入到 SQL Server 表中的内部数组。 JSON 文件的设置如下:
"121212":
"name": name of item,
"subject": item subject
,
"343434":
"name": name of item,
"subject": item subject
我可以使用 SQL Server 函数 OPENJSON() 导入单个数组而不会出现这样的问题:
DECLARE @arrayVariable VARCHAR(MAX)
SELECT @arrayVariable = BulkColumn FROM OPENROWSET(BULK 'array.json', SINGLE_BLOB) JSON
INSERT INTO ArrayTable (arrayName, arraySubject)
SELECT * FROM OPENJSON(@arrayVariable, '$."121212"')
WITH (
arrayName VARCHAR(MAX) '$.name',
arraySubject VARCHAR(MAX) '$.subject'
)
以上代码成功将数组 121212 导入到 ArrayTable 中。但是,我想知道是否有一种解决方案可以利用通配符作为 OPENJSON 的参数,以便从 JSON 数组中导入所有数字数组键,这样就不必单独导入它们。我尝试过使用通配符,但到目前为止我尝试过的格式化选项都没有奏效。例如:
OPENJSON(@arrayVariable, '$."[0-9]%"')
使用 OPENJSON() 导入所有带有数字标题的 JSON 数组的最佳方法是什么?
【问题讨论】:
不,SQL Server 中的 JSON 访问函数都不支持通配符/正则表达式。如果LIKE
对你来说足够了,你可以先做一个纯粹的OPENJSON
,然后再做一个结构化的:SELECT arrayName, arraySubject FROM OPENJSON(@j) _ CROSS APPLY OPENJSON([value]) WITH (arrayName VARCHAR(MAX) '$.name', arraySubject VARCHAR(MAX) '$.subject')
。
谢谢你,Jeroen,使用 CROSS APPLY 和 OPENJSON() 成功导入数据。
【参考方案1】:
试试这个
DECLARE @arrayVariable VARCHAR(MAX) = N'
"121212":
"name": "name of item1",
"subject": "item subject1"
,
"343434":
"name": "name of item2",
"subject": "item subject2"
'
SELECT v.arrayName, v.arraySubject
FROM OPENJSON(@arrayVariable) AS r
CROSS APPLY OPENJSON(r.value)
WITH (
arrayName VARCHAR(MAX) '$.name',
arraySubject VARCHAR(MAX) '$.subject'
) AS v
WHERE r.[key] LIKE '[0-9]%'
【讨论】:
谢谢你,wqw,这种将 CROSS APPLY 与 OPENJSON() 结合使用的方法非常适合导入 JSON 数据。以上是关于是否可以在 SQL Server 中使用通配符作为 OPENJSON 的参数?的主要内容,如果未能解决你的问题,请参考以下文章