У меня есть таблица со столбцом типа Nvarchar, где хранится json. Но формат некоторых его столбцов неправильный. Поэтому я получаю сообщение об ошибке, когда разбираю их все.

Я хочу, чтобы мой запрос игнорировал строки с ошибками.

SELECT *
FROM RequestLogs
CROSS APPLY OPENJSON(body) WITH(
    user varchar(60) '$.user',
    pass varchar(60) '$.pass'
    ) as a

Это дает эту ошибку, когда я запускаю все строки:

Текст JSON неправильно отформатирован. Неожиданный персонаж "." находится в позиции 0.

, но он выполняется правильно на top 10.

0
Mohammad Nazari 12 Окт 2020 в 13:44

1 ответ

Лучший ответ

Если я правильно понимаю, вы можете использовать ISJSON() для проверки действительности body перед его передачей OPENJSON():

SELECT *
FROM (SELECT * FROM RequestLogs WHERE ISJSON(body) = 1) as r
CROSS APPLY OPENJSON(body) WITH(
    user varchar(60) '$.user',
    pass varchar(60) '$.pass'
) as a

Это отфильтровывает строки с недопустимым содержимым. Если вы хотите сохранить их и вместо этого вернуть результат null, тогда:

SELECT r.*, a.*
FROM RequestLogs r
CROSS APPLY (VALUES(CASE WHEN WHERE ISJSON(r.body) = 1 THEN r.body END)) as x(body)
CROSS APPLY OPENJSON(x.body) WITH(
    user varchar(60) '$.user',
    pass varchar(60) '$.pass'
) as a

И, конечно же, вы можете определить нарушающие строки следующим образом:

SELECT body
FROM RequestLogs 
WHERE ISJSON(body) = 0
2
GMB 12 Окт 2020 в 11:16