无法从表中存储的JSON数据中提取有用的信息。
我在SQL Server表中存储了JSON数据,我想访问一个或两个元素以检查值等。我的表定义如下:
CREATE TABLE [Events].[events](
[eventID] [int] IDENTITY(1,1) NOT NULL,
[eventType] [smallint] NOT NULL,
[eventDate] [datetime] NOT NULL,
[eventMetaData] [nvarchar](max) NULL,
CONSTRAINT [PK_events] PRIMARY KEY CLUSTERED
(
[eventID] ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
将JSON数据保存在eventMetaData列中。
eventMetaData列存储数据如下:
[{
"jn": "jn1",
"src": "client123",
"id": 649
}]
,我想尝试提取此信息以显示在页面上。
到目前为止,尽管我相信我应该使用的JSON_VALUE
字符串,但我已经尝试使用JSON_QUERY
和JSON_VALUE
方法来提取所需的字符串。
SELECT top 10 eventId, eventDate,
JSON_VALUE(eventData,'$.jn') AS jn
from events
WHERE ISJSON(eventData)>0
order by eventdate desc
运行此命令时,我会获得eventID和eventDate,但在jn col中始终会得到NULL。
一些帖子显示了数据位于nvarchar(max)类型的变量中的示例,如果我将JSON放入其中,它可以与我的查询一起使用,但是我确实需要它来自表,因为我需要显示多行给我的客户。
在我上面发布的示例中,我想从查询中获取eventID,eventDate和jn值,但在一分钟后,我获得了eventID和eventDate,但在jn col中始终为NULL。
最终,我希望在JSON列中拥有更多密钥,我可以访问并显示给最终用户。
答案 0 :(得分:1)
我也无法使用JSON_VALUE,但是OPENJSON对我有用:
DECLARE @j NVARCHAR(255) =
'[{
"jn": "jn1",
"src": "client123",
"id": 649
}]'
SELECT [jn]
, [src]
, [id]
FROM OPENJSON(@j)
WITH (jn NVARCHAR(10) '$.jn'
, src NVARCHAR(255) '$.src'
, id INT '$.id'
)
答案 1 :(得分:1)
您非常亲密。如果您的eventMetaData
始终是包含一个元素的JSON
数组,则可以这样使用JSON_VALUE
:
表格:
CREATE TABLE [events] (
[eventID] [int] IDENTITY(1,1) NOT NULL,
[eventType] [smallint] NOT NULL,
[eventDate] [datetime] NOT NULL,
[eventMetaData] [nvarchar](max) NULL
)
INSERT INTO [events]
(eventType, eventDate, eventMetaData)
VALUES
(1, '20190618', N'[{"jn": "jn1","src": "client123","id": 649}]')
T-SQL:
SELECT
JSON_VALUE(eventMetaData, '$[0].jn') jn,
JSON_VALUE(eventMetaData, '$[0].src') src,
JSON_VALUE(eventMetaData, '$[0].id') id,
*
FROM [events]
输出:
jn src id eventID eventType eventDate eventMetaData
jn1 client123 649 1 1 18/06/2019 00:00:00 [{"jn": "jn1","src": "client123","id": 649}]
注意:
如果您的JSON
数组中还有更多项目,请将OPENJSON
与CROSS APPLY
运算符配合使用:
CREATE TABLE [events] (
[eventID] [int] IDENTITY(1,1) NOT NULL,
[eventType] [smallint] NOT NULL,
[eventDate] [datetime] NOT NULL,
[eventMetaData] [nvarchar](max) NULL
)
INSERT INTO [events]
(eventType, eventDate, eventMetaData)
VALUES
(1, '20190618', N'[{"jn": "jn1","src": "client123","id": 649}, {"jn": "jn2","src": "client124","id": 659}]')
SELECT
j.jn,
j.src,
j.id,
e.*
FROM [events] e
CROSS APPLY OPENJSON(e.eventMetaData) WITH (
jn nvarchar(3) '$.jn',
src nvarchar(50) '$.src',
id int '$.id'
) j