Вы можете использовать скалярную функцию, как писал @Lukasz Szozda - это хорошее решение для этого.Проблема, однако, со скалярными пользовательскими функциями T-SQL в вычисляемых столбцах заключается в том, что они разрушают производительность любого запроса, к которому относится таблица. Замедляется не только изменение (вставка, обновление, удаление) данных, но и любые планы выполнения запросов, которыеИспользование этой таблицы не может использовать план параллельного выполнения. Это имеет место, даже если на вычисляемый столбец нет ссылки в запросе .Даже построения индекса теряют способность использовать план параллельного выполнения.Обратите внимание на эту статью: Еще одна причина, по которой скалярные функции в вычисляемых столбцах - это плохая идея от Эрика Дарлинга.
Это не так красиво, но, если важна производительность, вы получите результаты.нужно без недостатков скалярного UDF.
CREATE TABLE dbo.jsonStrings
(
jsonString VARCHAR(8000) NOT NULL,
nameTxt AS (
SUBSTRING(
SUBSTRING(jsonString,
CHARINDEX('"Value":"',jsonString,
CHARINDEX('"Type":"Name",',jsonString,
CHARINDEX('"DataArray":[',jsonString)+12))+9,8000),1,
CHARINDEX('"',
SUBSTRING(jsonString,
CHARINDEX('"Value":"',jsonString,
CHARINDEX('"Type":"Name",',jsonString,
CHARINDEX('"DataArray":[',jsonString)+12))+9,8000))-1)) PERSISTED
);
INSERT dbo.jsonStrings(jsonString)
VALUES
('{
"Response":{
"DataArray":[
{
"Type":"Address",
"Value":"123 Fake St"
},
{
"Type":"Name",
"Value":"John Doe"
}
]
}
}');
Обратите внимание, что это хорошо работает для структуры, которую вы разместили.Это может потребоваться настроить в зависимости от того, что JSON делает и может выглядеть.
Вторым (и лучшим, но более сложным) решением было бы взять логику пути json из скалярного UDF Лукаша Шозды и поместить ее в CLR.Скалярные пользовательские функции T-SQL, при правильном написании, не имеют вышеупомянутых проблем, которые имеют скалярные пользовательские функции T-SQL.