Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Здравтствуйте, уважаемые знатоки!

Подскажите, пожалуйста, как лучше всего передать в хранимую процедуру
json простого вида {"field1": "value1", "field2": "value2",...} и там его разобрать.
Есть ли какие-то специальные фичи для этого, кроме строк?
Вызов - из Java.
Заранее спасибо!
17 окт 14, 12:28    [16719717]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Лучше XML передавайте.
17 окт 14, 12:32    [16719762]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Здравтствуйте, уважаемые знатоки!

Подскажите, пожалуйста, как лучше всего передать в хранимую процедуру
json простого вида {"field1": "value1", "field2": "value2",...} и там его разобрать.
Есть ли какие-то специальные фичи для этого, кроме строк?
Вызов - из Java.
Заранее спасибо!


SELECT @@VERSION
17 окт 14, 12:38    [16719832]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
pkarklin,

Извините, а чем лучше? Там что-то уже есть? Я не специалист в MSSQL,
это часть наследства. У меня RESTful с json, поэтому лишний раз крутить
нужно основание. Длина json - до нескольких десятков пар.
17 окт 14, 12:39    [16719835]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,


"Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
"
17 окт 14, 12:42    [16719856]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
afend,

автор
Там что-то уже есть?


Угу. Схематично:

CREATE PROC dbo.SomeProc @Data xml
AS

  select
    t.c.value('(ID/text())[1]', 'bigint')
    , t.c.value('(AnotherID/text())[1]', 'bigint')
    , t.c.value('(SoneString/text())[1]', 'varchar(8000)')
    , t.c.value('(Price/text())[1]', 'money')
  from @Data.nodes('/Path1/Path2/Path3') t(c);
17 окт 14, 12:48    [16719923]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
afend,

автор
Длина json - до нескольких десятков пар.


Одну строку передаете получается? Тогда просто хп с необходимыми параметрами.
17 окт 14, 12:51    [16719950]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
pkarklin,

строка одна, но количество пар каждый раз разное.
И я их состав и последовательность заранее не знаю.
Это всё я узнаю только внутри SP, если специально не
лезть за этим на сервер. Так захреначил дизайнер БД.
Кстати, в примере с XML Вы тоже разбираете файл "статически".
А если имена тэгов заранее не известны?
17 окт 14, 12:57    [16720023]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Winnipuh,


"Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Express Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
"


если у вас одноэтажный жсон ( {"field1": "value1", "field2": "value2",...} ) может передавать как @table?

Table-Valued Parameters

http://msdn.microsoft.com/en-us/library/bb510489.aspx
17 окт 14, 12:57    [16720032]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,

да, одноэтажный. Спасибо, посмотрю ссылку подробнее.
17 окт 14, 13:00    [16720077]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,

Глянул. Есть одна "некрасивость". Как я понял, эту табличку нужно заранее определить.
Или я что-то не допонял?
17 окт 14, 13:06    [16720141]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+ ко всему сказанному, можете сделать для какой-нибудь либы для парса json обертку CLR Stored Procedure и дергать ее как helper...

afend
...
Так захреначил дизайнер БД.
...


Потрольте его - спросите что вам теперь делать.
17 окт 14, 13:08    [16720173]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
churupaha
+ ко всему сказанному, можете сделать для какой-нибудь либы для парса json обертку CLR Stored Procedure и дергать ее как helper...

Почти ничего не понял.

afend
...
Так захреначил дизайнер БД.
...


Потрольте его - спросите что вам теперь делать.


Где ж его теперь найти?
17 окт 14, 13:10    [16720211]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Winnipuh,

Глянул. Есть одна "некрасивость". Как я понял, эту табличку нужно заранее определить.
Или я что-то не допонял?


тип определяете заранее если вы знаете структуру
Если у вас не пары, то использeqnt xml.

Но вы вродеописали, у вас пары, то есть структура известна

use tempdb;
GO

CREATE TYPE jsonTableType AS TABLE ( name VARCHAR(50), value VARCHAR(50) );
GO
CREATE PROCEDURE dbo.usp_test
    @json jsonTableType READONLY
    AS 
BEGIN
    SET NOCOUNT ON
	select * from @json
END
GO
declare @table as jsonTableType
insert @table (name, value)
values ('pole1', 'znacheine1'), ('pole2', 'znacheine2'), ('pole3', 'znacheine3')


exec dbo.usp_test @table

GO
17 окт 14, 13:14    [16720269]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Я склоняюсь к следующему варианту реализации процедуры, можете покритиковать:

передаю строку вида "field1:value1, field2:value2...", делаю функцию
разбора строки (а, может, такая уже есть?), делаю @sql на update/delete и exec.
17 окт 14, 13:17    [16720315]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,

Количество пар неизвестно, значение ключ, значение заранее тоже неизвестно.
17 окт 14, 13:19    [16720334]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Я склоняюсь к следующему варианту реализации процедуры, можете покритиковать:

передаю строку вида "field1:value1, field2:value2...", делаю функцию
разбора строки (а, может, такая уже есть?), делаю @sql на update/delete и exec.


то есть вам дают мотоцикл, а вы упорно пытаетесь сделать на коленке трехколесный кривой лисапед
17 окт 14, 13:20    [16720341]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Winnipuh,

Количество пар неизвестно, значение ключ, значение заранее тоже неизвестно.


вы не смотрели пример, который я вам слепил?

если вы знаете, что у вас будет коллекция пар "имя-значение", и не знаете их количество, то почему не использовать таблицу-параметр (для серверов версий >=2008)
17 окт 14, 13:21    [16720370]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,

сорри, не вкурил сразу ваш пример. Но мне еще эти ключ:значения
нужно проапдейтить в другой таблице, где ключ - столбец, значение - ячейка.
Одна из пар - ключ в таблице.
17 окт 14, 13:26    [16720415]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Кстати, ключ тоже может быть составной (по нескольким столбцам).
17 окт 14, 13:27    [16720434]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
afend
Кстати, в примере с XML Вы тоже разбираете файл "статически".
А если имена тэгов заранее не известны?


Вы хотите написать одну хп которая бы обрабатывала заведомо неизвестный набор? А что Вы потом будете делать? Генерить динамику? Не вижу тогда никакого смысла в хп и передачи json на сервер. Парсите его на среднем звене и передавайте инструкции INSERT\UPDATE\DELETE.
17 окт 14, 13:37    [16720535]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
afend
Кстати, ключ тоже может быть составной (по нескольким столбцам).



А вы задачу можете описать, не сбиваясь на свои предположения о реализации?
это было бы полезно вам самому в первую очередь.
17 окт 14, 13:51    [16720670]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Winnipuh,

я уже подумал о какой-то более внятной постановке задачи для вас.
В упрощенном виде.

1. Общая схема работы приложения:
браузер (фреймворк UI) -> NodeJS -> REST -> DB
DB разные (MSSQL, MySQL, Oracle), поэтому уже решено (до исторического материализма) звать SP.
Архитектура решения принята и вне нашего обсуждения.

2. Структура БД следующая (без лишних деталей):
есть таблица Forms, в которой есть столбец TableName, в этой таблице и находятся собственно данные.
Естественно, что каждая такая таблица имеет свою структуру.

3. Как всё это работает:
В браузере нажимается в ui grid кнопочка update и фреймворк посылает строку json на сервер.
Также в http-запросе как аргументы идут FormId и ключи для записей целевой таблицы.

Алгоритм обновления следующий:
- по FormId из таблицы форм извлекаем TableName;
- в этой TableName изменяем по указанным ключам УКАЗАННЫЕ поля (полей в самой таблице
может быть больше, чем в json).

Уф-ф, как-то так!
17 окт 14, 14:29    [16721018]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Да, кое-что еще. Ключевых полей для апдейта может быть несколько.
17 окт 14, 14:41    [16721110]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL: как лучше передавать json в хранимую процедуру  [new]
afend
Member

Откуда:
Сообщений: 133
Ну, и-и-и...
17 окт 14, 17:43    [16722626]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить