json - SQL Server 查询仅从有效 JSON 中返回第一行
问题描述
为什么下面的这个查询只返回 JSON 的第一行?
DECLARE @JSON NVARCHAR(MAX)
SELECT @JSON = BulkColumn
FROM OPENROWSET
(BULK 'C:/Users/jose.carvalho/Downloads/output/output/dataset_000.txt', SINGLE_CLOB)
AS j
SELECT *
FROM OPENJSON (@JSON)
WITH ( timestamp VARCHAR(20) '$.timestamp',
type VARCHAR(20) '$.type',
role VARCHAR(20) '$.role',
actor_id varchar(100) '$.actor.id',
actor_name varchar(100) '$.actor.first_name',
actor_name varchar(100) '$.actor.last_name',
last_name varchar(100) '$.actor.gender',
gender_name varchar(100) '$.movie.id',
movie_id varchar(100) '$.movie.name',
movie_name varchar(100) '$.movie.name',
movie_year varchar(100) '$.movie.year',
movie_rank varchar(100) '$.movie.rank') -- new column name
文件内的 JSON 数据:
{"timestamp": 1293847260, "type": "role", "role": "Julia 'Julie' Pendleton", "actor": {"id": 560320, "first_name": "Betty", "last_name": "Bouton", "gender": "F"}, "movie": {"id": 76619, "name": "Daddy-Long-Legs", "year": 1919, "rank": 7.1}}
{"timestamp": 1293847320, "type": "role", "role": "Noirtier", "actor": {"id": 345936, "first_name": "Carlo", "last_name": "Ninchi", "gender": "M"}, "movie": {"id": 384908, "name": "\"Conte di Montecristo, Il\"", "year": 1966}}
{"timestamp": 1293847380, "type": "role", "actor": {"id": 484191, "first_name": "Yasuharu", "last_name": "Umeono", "gender": "M"}, "movie": {"id": 127329, "name": "Ghulam", "year": 2005, "rank": 7.1}}
{"timestamp": 1293847440, "type": "actor", "id": 116238, "first_name": "Alayna", "last_name": "Dekelbaum", "gender": "M"}
{"timestamp": 1293847500, "type": "movie", "id": 16132, "name": "And There Were Seven", "year": 1991}
{"timestamp": 1293847560, "type": "movie", "id": 338669, "name": "Tre fratelli calciatori, I", "year": 2005}
{"timestamp": 1293847620, "type": "role", "role": "Joseph Mendel", "actor": {"id": 300510, "first_name": "Garry", "last_name": "Marsh", "gender": "M"}, "movie": {"id": 194772, "name": "Lost Chord, The", "year": 1934}}
{"timestamp": 1293847680, "type": "movie", "id": 143796, "name": "Hermie & Friends", "year": 2005}
{"timestamp": 1293847740, "type": "actor", "id": 525725, "first_name": "Yu (II)", "last_name": "Zhang", "gender": "M"}
{"timestamp": 1293847800, "type": "actor", "id": 174338, "first_name": "Fran\u00e7ois (I)", "last_name": "Girard", "gender": "M"}
解决方案
您的 Json 格式不正确,因为它没有comma(,)
在每个 Json 数据的末尾。
尝试这个
DECLARE @JSON NVARCHAR(MAX)
SELECT
@JSON = '[' + RIGHT(REPLACE(d.BulkColumn, '{"timestamp":', ',{"timestamp":'),LEN(REPLACE(d.BulkColumn, '{"timestamp":', ',{"timestamp":'))-1)+ ']'
FROM OPENROWSET
(BULK 'D:/dataset_000.txt', SINGLE_CLOB) d
SELECT @JSON
SELECT *
FROM OPENJSON (@JSON)
WITH ( timestamp VARCHAR(20) '$.timestamp',
type VARCHAR(20) '$.type',
role VARCHAR(20) '$.role',
actor_id varchar(100) '$.actor.id',
actor_name varchar(100) '$.actor.first_name',
actor_name varchar(100) '$.actor.last_name',
last_name varchar(100) '$.actor.gender',
gender_name varchar(100) '$.movie.id',
movie_id varchar(100) '$.movie.name',
movie_name varchar(100) '$.movie.name',
movie_year varchar(100) '$.movie.year',
movie_rank varchar(100) '$.movie.rank') -- new column name
推荐阅读
- c# - 如何在 crud 操作中使用 MOQ
- javascript - 当我使用 setState 回调来 toggleDropdown 我的下拉菜单在选择项目后打开
- java - HttpServletRequest getParameterMap - 单独获取表单参数
- c++ - 弗兰克·卢纳 (Frank Luna) 对他的书“使用 DirectX12 进行 3D 游戏编程”的介绍中的盒子示例的问题
- python - 如何通过css选择器查找包含属性和文本的元素
- python - 使用 Azure CLI、Rest API 或 Python 在 Azure ADLS gen2 中复制文件
- python - 具有超过 3 列的 ColumnTransformer
- overlap - 如何控制kmz中多边形的重叠顺序
- azure - 如何在发布管道中将文件保存到 Azure 存储帐户?
- python - INFO:tensorflow:Error 报告给 Coordinator:
,发现 2 个根错误