С SQL-Server 2016 это довольно просто. Есть довольно некоторая поддержка JSON. Ваша единственная проблема в том, что ваша строка неверна. Совершенно очевидно, что был механизм, удваивающий все внутренние кавычки (техника выхода).
Если это под вашим контролем, попробуйте изменить формат столбца на правильный JSON. Еще лучше, чтобы приложение для написания предоставило эти проверки в правильном формате JSON. По крайней мере, вы можете добавить второй столбец и использовать триггер для синхронизации. В крайнем случае вы можете использовать REPLACE
для восстановления вашей строки:
REPLACE(REPLACE(REPLACE(@YourString,'"{','{'),'}"','}'),'""','"');
При большом количестве строк это может занять некоторое время ... Поэтому лучше поддерживать формат в надлежащем формате JSON.
Просто чтобы показать принципы:
DECLARE @YourString NVARCHAR(MAX)=N'"{""Id"":""44de2468"",""RecordType"":20,""CreationTime"":""2018-08-03T12:30:34"",""Operation"":""ViewReport"",""OrganizationId"":""779558"",""UserType"":0,""UserKey"":""FFFA3DA"",""Workload"":""PowerBI"",""UserId"":""john@abc.com"",""ClientIP"":""9.5.3.26"",""UserAgent"":""Mozilla\/5.0 (Windows NT 10.0;"",""Activity"":""ViewReport"",""ItemName"":""Sales"",""WorkSpaceName"":""TeamITO"",""DatasetName"":""Sales1"",""ReportName"":""Sales1"",""WorkspaceId"":""e8eaa0ca"",""ObjectId"":""Sales1"",""DatasetId"":""4c5d-ad45-eb6546"",""ReportId"":""4cb0-99ad-de41b5160c47"",""IsSuccess"":true,""DatapoolRefreshScheduleType"":""None"",""DatapoolType"":""Undefined""}"';
SET @YourString = REPLACE(REPLACE(REPLACE(@YourString,'"{','{'),'}"','}'),'""','"');
Теперь ваша строка будет выглядеть так:
{"Id":"44de2468","RecordType":20,"CreationTime":"2018-08-03T12:30:34","Operation":"ViewReport","OrganizationId":"779558","UserType":0,"UserKey":"FFFA3DA","Workload":"PowerBI","UserId":"john@abc.com","ClientIP":"9.5.3.26","UserAgent":"Mozilla\/5.0 (Windows NT 10.0;","Activity":"ViewReport","ItemName":"Sales","WorkSpaceName":"TeamITO","DatasetName":"Sales1","ReportName":"Sales1","WorkspaceId":"e8eaa0ca","ObjectId":"Sales1","DatasetId":"4c5d-ad45-eb6546","ReportId":"4cb0-99ad-de41b5160c47","IsSuccess":true,"DatapoolRefreshScheduleType":"None","DatapoolType":"Undefined"}
Этот запрос вернет все ваши столбцы в виде списка:
SELECT *
FROM OPENJSON(@YourString);
Результат возвращает список с подсказкой типа (в то время как фактический тип «value» равен nvarchar
):
+-----------------------------+-------------------------------+------+
| key | value | type |
+-----------------------------+-------------------------------+------+
| Id | 44de2468 | 1 |
+-----------------------------+-------------------------------+------+
| RecordType | 20 | 2 |
+-----------------------------+-------------------------------+------+
| CreationTime | 2018-08-03T12:30:34 | 1 |
+-----------------------------+-------------------------------+------+
| Operation | ViewReport | 1 |
+-----------------------------+-------------------------------+------+
| OrganizationId | 779558 | 1 |
+-----------------------------+-------------------------------+------+
| UserType | 0 | 2 |
+-----------------------------+-------------------------------+------+
| UserKey | FFFA3DA | 1 |
+-----------------------------+-------------------------------+------+
| Workload | PowerBI | 1 |
+-----------------------------+-------------------------------+------+
| UserId | john@abc.com | 1 |
+-----------------------------+-------------------------------+------+
| ClientIP | 9.5.3.26 | 1 |
+-----------------------------+-------------------------------+------+
| UserAgent | Mozilla/5.0 (Windows NT 10.0; | 1 |
+-----------------------------+-------------------------------+------+
| Activity | ViewReport | 1 |
+-----------------------------+-------------------------------+------+
| ItemName | Sales | 1 |
+-----------------------------+-------------------------------+------+
| WorkSpaceName | TeamITO | 1 |
+-----------------------------+-------------------------------+------+
| DatasetName | Sales1 | 1 |
+-----------------------------+-------------------------------+------+
| ReportName | Sales1 | 1 |
+-----------------------------+-------------------------------+------+
| WorkspaceId | e8eaa0ca | 1 |
+-----------------------------+-------------------------------+------+
| ObjectId | Sales1 | 1 |
+-----------------------------+-------------------------------+------+
| DatasetId | 4c5d-ad45-eb6546 | 1 |
+-----------------------------+-------------------------------+------+
| ReportId | 4cb0-99ad-de41b5160c47 | 1 |
+-----------------------------+-------------------------------+------+
| IsSuccess | true | 3 |
+-----------------------------+-------------------------------+------+
| DatapoolRefreshScheduleType | None | 1 |
+-----------------------------+-------------------------------+------+
| DatapoolType | Undefined | 1 |
+-----------------------------+-------------------------------+------+
А еще лучше, вы можете добавить предложение WITH
как здесь:
SELECT *
FROM OPENJSON(@YourString)
WITH
(
Id varchar(200) '$.Id',
RecordType int '$.RecordType',
CreationTime datetime '$.CreationTime'
--Add all your known columns here...
)
При этом вы набираете значения и бок о бок
+----------+------------+-------------------------+
| Id | RecordType | CreationTime |
+----------+------------+-------------------------+
| 44de2468 | 20 | 2018-08-03 12:30:34.000 |
+----------+------------+-------------------------+