OPENJSON, явная схема и тип данных
Пересказ статьи Marty Catherall. OPENJSON, explicit schema and data type
Когда мы читали данные из документа в табличный формат, то указывали такие столбцы:
* value (значение)
* minimum (минимум)
* maximum (максимум)
* value_in_use (используемое значение)
* description (описание)
Те из них, которые имеют тип SQL_VARIANT в таблице, на самом деле имели тип NVARCHAR(200) в результирующем наборе, который был возвращен из документа JSON.
Но почему так, и можем мы исправить это?
Ну, и JSON имеет несколько типов данных, не говоря уже о SQL Server. Так что здесь нет однозначного соответствия.
Лучшее, что можно сделать, - это вернуть их к одному из простых типов (скорее всего, NVARCHAR ()), а затем преобразовать их в SELECT к уже требуемому типу данных.
Примерно так
Результат выглядит так же, однако возвращаемые значения теперь имеют корректный тип данных. Поэтому, если вы хотите сделать что-нибудь с результирующим набором, например, соединить с оригинальной таблицей, то вы не увидите никакого неявного преобразования.
Это был просто маленький совет, как обработать разницу в типах данных между JSON и SQL Server.
Я надеюсь, что это помогло вам в путешествии по использованию JSON в SQL Server. А я скоро продолжу.
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. А я скоро продолжу.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой