|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Добрый день! Подскажите, пожалуйста, можно ли сделать так, как хочу. Или, возможно, для этого есть лучшее решение. Microsoft SQL Server 2008 R2 Приложение (веб-сервис) взаимодействует с sql-сервером через вызов процедур. Есть таблица на 100+ колонок, в которую нужно вставлять данные. Описывать каждое поле отдельным параметром показалось непрактичным, поэтому передаю параметром в хранимую процедуру xml. Логика процедуры - вставка с условием. Хорошо бы подошло какое-то решение, при котором можно было бы преобразовывать xml-документ в таблицу/тупл с динамическим созданием колонок (названий, типов). Сейчас есть две трудности: а) динамическое создание колонок с сохранением оригинального названия (имя ноды); б) динамическая спецификация типа. Поиски в сети пока не приводят к решению. Был бы рад услышать любые советы, рекомендации, замечания по озвученному вопросу. Упрощенный пример: XML и его разбор в ручном режиме: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Результат: Ожидание: Подобный результат, но без ручной спецификации каждой колонки. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 17:42 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja, зачем? Храните XML в колонке. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 17:56 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja можно было бы преобразовывать xml-документ в таблицу/тупл с динамическим созданием колонок (названий, типов). ЗЫ: Почитайте про параметры табличного типа. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 18:11 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Владислав Колосов, наверное, можно было бы рассмотреть такой вариант, но а) на таблице различные ограничения: как по сингл, так и по мультиполям; б) на таблицу джоинится всякое разное; в) так, в целом, не принято. То есть, сейчас я рассматриваю вариант, как было бы удобнее вставлять мне, а есть еще и удобство других, у которых уже свои селекты. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 18:38 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
invm, почти простой инсерт, но некоторая логига все же, возможно, потребуется позже. Тогда вы, наверное, скажете про триггер на вставку, и я бы это рассмотрел, но процедура вызывается не из ms sql пространства. Поэтому мне кажется, что табличный параметр не подойдет. Или мне все же надо еще почитать про них? upd: извините за мультипост, не сразу заметил кнопку "редактировать". upd2: если в меру простого решения для задачи нет, то я тоже хотел бы услышать это как мнение. Пока, пытаясь что-то придумать, я все еще рассматриваю "хардкод" на все поля. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 18:43 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja процедура вызывается не из ms sql пространства В принципе, если дополните xml признаком стрпока/число, можно будет достаточно просто сгенерировать инструкцию insert. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 19:11 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja, надо придумать какое-то иное решение, в таком случае. Таблиц с переменным количеством колонок не бывает в реляционной механике. Если Вы практикуете ООП, то можете создать в методе конструктор запросов на базе конфигурации, которая будет храниться на сервере, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 19:29 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
invm, структурой и составом входного xml я полностью управляю, поэтому могу сделать его любым. Еще поиграюсь, но пока не вижу простого способа вставки без спецификации каждого поля. Есть вариант: преобразовывать xml к таблице с одной колонкой, где будут значения всех нод. Далее транспонировать это и уже вставлять, но это как-то "грязно" и накладывает очень большие требования на соблюдение порядка. Владислав Колосов, прямые запросы невозможны по архитектуре, только вызов процедур. Количество полей постоянно, а не переменно. Только их много, что делает неудобным ручную спецификацию в процедуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 19:33 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 19:48 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja Количество полей постоянно, а не переменно. Только их много, что делает неудобным ручную спецификацию в процедуре. Но это же делается один раз всего. И в любом случае вы в INSERT специфицируете эти поля. Иначе, если я правильно понимаю задачу, вы хотите передать (где то сформированный) кусок текста в процедуру, потом его распарсить его на значения и вставить. Но зачем а) создавать xml, б) потом заставлять сервер его разбирать? Etoneja в таблицу/тупл с динамическим созданием колонок Окей, будет у вас временная таблица/табличная переменная созданная динамически из xml. А дальше то надо вставлять в обычную таблицу и как это у вас реализовано? Динамически? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.07.2020, 20:29 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
invm, Интересный ход мыслей. Решение рабочее и задачу, определенную в стартовом сообщении топика, решает. Спасибо, возьму идею на заметку. Пока не вижу причин не использовать, хотя надо будет "поиграться" со специальными символами и придумать более-менее элегатный способ для обработки нескольких строк в исходном xml. PizzaPizza Иначе, если я правильно понимаю задачу, вы хотите передать (где то сформированный) кусок текста в процедуру, потом его распарсить его на значения и вставить. Но зачем а) создавать xml, б) потом заставлять сервер его разбирать? Не совсем так. Задача другими словами: взаимодействие с объектами БД через RPC. Когда параметров становится много с ними уже неудобно работать по ряду причин. Поэтому все эти параметры упаковываются в xml (что-то вроде примитивного ООП - его можно и провалидировать в приложении). Вопрос заключался в том, как этот xml, переданный параметром в хранимую процедуру, динамично разобрать. Возможно, это "велосипед", но других вариантов не придумал. Пользователь invm предложил решение не преобразовывать это в тупл/таблицу, как я изначально хотел, а склеивать и выполнять в виде запроса. Это, может быть, не очень "чисто", но дает ту самую динамичность. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 00:12 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja, Но про динамичность не понятно. Добавление новых тегов в xml автоматически не добавит их в таблицу базы. Динамическое в плане EtonejaЕсть таблица на 100+ колоноки по этому вам нужна возможность вставлять то 50 значений, то 100, то 2 ? Я бы очень подумал про дизайн базы в данном случае. Опять же, если вы пишете на С# то там можно создать "таблицу" (пользовательский тип данных) прям в приложении и передать в процедуру. И из неё сделать SELECT * FROM @пользовательская_табличная_переменная ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 01:40 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
Etoneja, invm Вам нарисовал конструктор запроса, но этот конструктор лучше организовать на стороне сервиса. Формально задачи слоя приложений должен решать слой приложений. Т.е. разработчик веб-приложения решает понятную ему задачу согласно полученной спецификации таблицы, а разработчик БД решает задачи, связанные с размещением этих данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 11:50 |
|
XML в таблицу/тупл с динамическим созданием колонок
|
|||
---|---|---|---|
#18+
PizzaPizza Etoneja, Но про динамичность не понятно. Добавление новых тегов в xml автоматически не добавит их в таблицу базы. Динамическое в плане EtonejaЕсть таблица на 100+ колонок Я бы очень подумал про дизайн базы в данном случае. В одном из продуктов морского млекопитающего так был реализован сервис отчетности: Таблица на н-цать фиксированных столбцов, каждый из которых ассоциировался с полем генератора отчета. Данные загонялись в нужные поля с ID процесса, который вызывал формирование отчета ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:53 |
|
|
start [/forum/topic.php?fid=46&msg=39979601&tid=1685875]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 262ms |
total: | 398ms |
0 / 0 |