Skip to content

OPENJSON, явная схема и тип данных

Пересказ статьи Marty Catherall. OPENJSON, explicit schema and data type


Когда мы читали данные из документа в табличный формат, то указывали такие столбцы:
* value (значение)
* minimum (минимум)
* maximum (максимум)
* value_in_use (используемое значение)
* description (описание)

Те из них, которые имеют тип SQL_VARIANT в таблице, на самом деле имели тип NVARCHAR(200) в результирующем наборе, который был возвращен из документа JSON.
SELECT
[configuration_id]
,[Configuration name]
,[Value]
,[minimum]
,[maximum]
,[value_in_use]
,[description]
,[is_dynamic]
,[is_advanced]
FROM
OPENJSON
(
'
{
"configuration_id": 101,
"Configuration name": "recovery interval (min)",
"Value": 0,
"minimum": 0,
"maximum": 32767,
"value_in_use": 0,
"description": "Maximum recovery interval in minutes",
"is_dynamic": true,
"is_advanced": true
}
'
)
WITH
(
[configuration_id] INT
,[Configuration name] NVARCHAR(35)
,[Value] NVARCHAR(200)
,[minimum] NVARCHAR(200)
,[maximum] NVARCHAR(200)
,[value_in_use] NVARCHAR(200)
,[description] NVARCHAR(200)
,[is_dynamic] BIT
,[is_advanced] BIT
);
GO

Но почему так, и можем мы исправить это?
Ну, и JSON имеет несколько типов данных, не говоря уже о SQL Server. Так что здесь нет однозначного соответствия.
Лучшее, что можно сделать, - это вернуть их к одному из простых типов (скорее всего, NVARCHAR ()), а затем преобразовать их в SELECT к уже требуемому типу данных.
Примерно так
SELECT
[configuration_id]
,[Configuration name]
,[Value] = TRY_CONVERT(sql_variant , [Value])
,[minimum] = TRY_CONVERT(sql_variant , [minimum])
,[maximum] = TRY_CONVERT(sql_variant , [maximum])
,[value_in_use] = TRY_CONVERT(sql_variant , [value_in_use])
,[description] = TRY_CONVERT(sql_variant , [description])
,[is_dynamic]
,[is_advanced]
FROM
OPENJSON
(
'
{
"configuration_id": 101,
"Configuration name": "recovery interval (min)",
"Value": 0,
"minimum": 0,
"maximum": 32767,
"value_in_use": 0,
"description": "Maximum recovery interval in minutes",
"is_dynamic": true,
"is_advanced": true
}
'
)
WITH
(
[configuration_id] INT
,[Configuration name] NVARCHAR(35)
,[Value] NVARCHAR(200)
,[minimum] NVARCHAR(200)
,[maximum] NVARCHAR(200)
,[value_in_use] NVARCHAR(200)
,[description] NVARCHAR(200)
,[is_dynamic] BIT
,[is_advanced] BIT
);
GO

Результат выглядит так же, однако возвращаемые значения теперь имеют корректный тип данных. Поэтому, если вы хотите сделать что-нибудь с результирующим набором, например, соединить с оригинальной таблицей, то вы не увидите никакого неявного преобразования.
Это был просто маленький совет, как обработать разницу в типах данных между JSON и SQL Server.
Я надеюсь, что это помогло вам в путешествии по использованию JSON в SQL Server. А я скоро продолжу.
Категории: T-SQL

Обратные ссылки

Нет обратных ссылок

Комментарии

Показывать комментарии Как список | Древовидной структурой

Нет комментариев.

Автор не разрешил комментировать эту запись

Добавить комментарий

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options

Добавленные комментарии должны будут пройти модерацию прежде, чем будут показаны.