#sql #json #sql-server #ssis #ssis-2012
#sql #json #sql-сервер #ssis #ssis-2012
Вопрос:
Я работаю над вложенными данными JSON, которые мне нужно загрузить в SQL SERVER 2012. Вложенный JSON содержит два корня, то есть один столбец и другие строки. Мне нужно поместить значение из строки в столбец. Пожалуйста, смотрите структуру, как показано ниже:
{
"tables": [
{
"name": "PrimaryResult",
"columns": [
{
"name": "timestamp",
"type": "datetime"
},
{
"name": "id",
"type": "string"
},
{
"name": "name",
"type": "string"
},
{
"name": "url",
"type": "string"
},
{
"name": "duration",
"type": "real"
}
],
"rows": [
[
"2019-04-08T13:09:52.871Z",
"244",
"Internal",
"https://google.com",
1245,
]
]
}
]
}
Результат:
timestamp id name url duration
2019-04-08 244 Internal https://google.com 1245
Здесь, в sql Server, он должен принимать имена столбцов из столбцов и значение для каждого столбца из строк
Комментарии:
1. Это сложная проблема, но некоторое время назад Фил Фактор поделился некоторыми решениями. red-gate.com/simple-talk/sql/t-sql-programming /…
2. Да, Luis, это немного сложный сценарий, в котором на самом деле значения не определены в значении ключа, вместо этого они обрабатываются как массив.
Ответ №1:
предполагая, что вы сохраняете json в файл с именем json.txt
import json
with open('json.txt') as f:
data = json.load(f)
tableName = data['tables'][0]["name"]
sqlCreateTable = 'CREATE TABLE ' tableName ' (n'
sqlInsertInto = 'INSERT INTO ' tableName ' ('
for i in range(0,len(data['tables'][0]['columns'])):
columnName = data['tables'][0]['columns'][i]['name']
type = data['tables'][0]['columns'][i]['type']
sqlCreateTable = columnName " " type ',n'
sqlInsertInto = columnName ', '
sqlCreateTable = sqlCreateTable[:-2] 'n);'
sqlInsertInto = sqlInsertInto[:-2] ')nVALUES ('
for value in data['tables'][0]['rows'][0]:
sqlInsertInto = str(value) ', '
sqlInsertInto = sqlInsertInto[:-2] ');'
print(sqlCreateTable)
print(sqlInsertInto)
Вывод для создания таблицы:
CREATE TABLE PrimaryResult (
timestamp datetime,
id string,
name string,
url string,
duration real
);
Вывод для вставки в таблицу:
INSERT INTO PrimaryResult (timestamp, id, name, url, duration)
VALUES (2019-04-08T13:09:52.871Z, 244, Internal, https://google.com, 1245);
Комментарии:
1. Спасибо Cristian Iacob за ваше решение. На самом деле для его выполнения потребовалось немного времени, но да, наконец, получен результат с использованием приведенного выше кода на C #. Большое спасибо за вашу помощь.