Первый совет: перейдите на v2016, если возможно, для использования поддержки JSON. v2008 абсолютно устарел ...
Второй совет: любое строковое действие (и все мои подходы ниже также потребуют некоторых строковых действий) будет страдать от запрещенных символов, неожиданных пробелов или любых других неожиданностей, которые вы можете найти в ваших данных.
Попробуйте это так:
Сначала я создаю сценарий макета для имитации вашей проблемы
DECLARE @tbl TABLE(ID INT IDENTITY,YourJson NVARCHAR(MAX));
INSERT INTO @tbl VALUES
(N'{ "Type":"test1",
"Admin":"test1",
"User":{
"UserID":"16959191",
"FirstName":"Test1",
"Surname":"Test1a",
"EmailAddress":"Test1.Test1@test.com",
"Address":"Test1"
}
}')
,(N'{ "Type":"test2",
"Admin":"test2",
"User":{
"UserID":"16959191",
"FirstName":"Test2",
"Surname":"Test2a",
"EmailAddress":"Test2.Test2@test.com",
"Address":"Test2"
}
}');
- Начиная с v2016 есть JSON поддержка
SELECT JSON_VALUE(t.YourJson, '$.User.EmailAddress')
FROM @tbl t
- Строковые методы - использовать CHARINDEX AND SUBSTRING
DECLARE @FirstBorder NVARCHAR(MAX)='"EMailAddress":';
DECLARE @SecondBorder NVARCHAR(MAX)='",';
SELECT t.*
,A.Pos1
,B.Pos2
,SUBSTRING(t.YourJson,A.Pos1,B.Pos2 - A.Pos1) AS ExtractedEMail
FROM @tbl t
OUTER APPLY(SELECT CHARINDEX(@FirstBorder,t.YourJson)+LEN(@FirstBorder)) A(Pos1)
OUTER APPLY(SELECT CHARINDEX(@SecondBorder,t.YourJson,A.Pos1)) B(Pos2);
- использовать XML трюк
SELECT CAST('<x>' + REPLACE(REPLACE((SELECT t.YourJson AS [*] FOR XML PATH('')),'"EmailAddress":','<mailAddress value='),',',' />') + '</x>' AS XML)
.value('(/x/mailAddress/@value)[1]','nvarchar(max)')
FROM @tbl t
Некоторые объяснения:
- JSON -поддержка будет анализировать значение непосредственно из пути JSON.
- Для CHARINDEX И SUBSTRING я использую
APPLY
. Преимущество состоит в том, что вы можете использовать вычисленные позиции как переменную. Не нужно повторять операторы CHARINDEX снова и снова. - Подход XML превратит ваш JSON в довольно странный и безобразный XML. Единственный разумный элемент -
<mailAddress>
с атрибутом value
. Мы можем использовать нативный XML метод .value()
для получения значения, которое вы запрашиваете:
Промежуточное значение XML выглядит следующим образом:
<x>{ "Type":"test1" />
"Admin":"test1" />
"User":{
"UserID":"16959191" />
"FirstName":"Test1" />
"Surname":"Test1a" />
<mailAddress value="Test1.Test1@test.com" />
"Address":"Test1"
}
}</x>