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

Откуда: Кишинёв
Сообщений: 6724
Сон Веры Павловны
синтаксический сахар
Особенно прикольно контрастирует с реализацией передачи табличной переменной в с++.
31 мар 14, 19:35    [15813321]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Передача массивов в хранимые процедуры  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
Всем привет!
Что бы не плодить топики спрошу тут.
Создал табличный тип, заполнил таблицу и передал в процедуру этой же БД. Все работает прекрасно, вопросов нет.
Идем дальше. Создаю точно такой же тип в другой базе этого же сервера (MS SQL 2008).
Выполняю процедуру из той базы:
exec barsql..ExpPriemNakl   @LocationTVP, @LocationTVA

Получаю сообщение:
автор
Сообщение 206, уровень 16, состояние 2, процедура ExpPriemNakl, строка 0
Конфликт типов операндов: LocationTableRealizz несовместим с LocationTableRealiz

Можно ли как-то во второй базе сослаться на табличный тип вызывающей базы? Я так понимаю проблема именно в этом.
Типы в обоих базах 100% идентичны.

Ну и 3й вопрос еще более грустный.
Собственно для чего и затевал игру с таблицей в параметрах процедуры. Это когда вызывается такая же процедура со связанного сервера.
автор
Сообщение 7380, уровень 16, состояние 1, процедура ExpRealNew, строка 37
Возвращающие табличные значения параметры не поддерживаются в удаленных вызовах между серверами.

Это решаемо ил инет в принципе?
Да, в последнем случае связанный сервер MS SQL 2014.
24 сен 16, 14:57    [19704053]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Odess
Можно ли как-то во второй базе сослаться на табличный тип вызывающей базы? Я так понимаю проблема именно в этом.
Типы в обоих базах 100% идентичны.
Табличные параметры - кривая недоделка, прямо с самого начала их появления. Сделали, и сразу на них забили, хотя недостатков огромное количество, начиная с первоначальной архитектуры.
The behavior you are describing is "As designed"
Odess
Это решаемо ил инет в принципе?
Со связанными серверами тем более нерешаемо.
24 сен 16, 15:50    [19704133]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
alexeyvg
]Со связанными серверами тем более нерешаемо.

Спасибо за ответ!
То есть остается только XML?
24 сен 16, 16:13    [19704170]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
alexeyvg
Табличные параметры - кривая недоделка, прямо с самого начала их появления. Сделали, и сразу на них забили, хотя недостатков огромное количество, начиная с первоначальной архитектуры.

Да, но, тем не менее, они по скорости передачи массивов на клиент уделывают все существующие спососбы.
24 сен 16, 16:30    [19704199]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
C клиента
24 сен 16, 17:22    [19704307]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Mike_za
C клиента

да, пардон, с клиента, конечно же.
24 сен 16, 17:31    [19704324]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Сон Веры Павловны
alexeyvg
Табличные параметры - кривая недоделка, прямо с самого начала их появления. Сделали, и сразу на них забили, хотя недостатков огромное количество, начиная с первоначальной архитектуры.

Да, но, тем не менее, они по скорости передачи массивов на клиент уделывают все существующие спососбы.
Уделывают.
Но при этом "сразу на них забили, хотя недостатков огромное количество, начиная с первоначальной архитектуры.
"
Никаких противоречий :-)

Соответственно, мало их используют, из за этих недостатков.
Odess
То есть остается только XML?
Да. Можно, конечно, и в строке передавать, и разбирать (и не только в обычной строке, но и в байтовом массиве), но это не так удобно.
24 сен 16, 21:26    [19704917]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
alexeyvg
хотя недостатков огромное количество, начиная с первоначальной архитектуры.

Не подискутировать ради, а просто интересно - о каких недостатках речь? Если о типа таких, на которые наткнулся ТС - ну, они вылезают раз в сто лет, и достаточно экзотического характера. Из известных мне - только передача между процедурами строго с модификатором readonly, ну да я с этим смирился.
24 сен 16, 23:24    [19705187]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Сон Веры Павловны
о каких недостатках речь?
Серьезных - два.
Один вы уже упомянули.
Второй - невозможность модификации табличного типа, если на него есть ссылки. Это обходится (17874530), но не всегда гладко.
24 сен 16, 23:38    [19705216]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2518
>Odess, вчера, 14:57 [19704053]
>...Идем дальше. Создаю точно такой же тип ...
>...Выполняю процедуру из той базы ...

А если не сразу вызывать ХП из другой базы, а написать на C# в вызывающей базе промежуточную процедуру и из неё уже вызывать нужную ХП в вызываемой базе. Тогда промежуточная процедура есть клиент.

С уважением,
Владимир.
25 сен 16, 00:16    [19705269]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
Сон Веры Павловны
Из известных мне - только передача между процедурами строго с модификатором readonly, ну да я с этим смирился.

invm
Второй - невозможность модификации табличного типа, если на него есть ссылки. Это обходится (17874530), но не всегда гладко.

Да, вот как минимум два этих недостатка. Первый из них делает невозможным полноценное программирование, а второй - это просто неудобно.

Третий - собственно то, что нужно делать табличный тип, со всеми вытекающими.

Непонятно, зачем такое вообще придумали, учитывая, что сиквел, в общем то, не такой уж типизированный язык. По крайней мере, в SQL не нужно объявлять табличный тип для создания таблицы, или для написания SELECT (для объявления типа возвращаемого результата, рекордсета).

Было бы удобнее определять параметр так:
create procedure MyProc
    @param1 int = 1,
    @param2 table(id int primary key, amount float) = values(1, 0.0), (2, 0.0)
as

Причём, разумеется, этот табличный параметр не должен быть readonly, и? более того, таблица, передаваемая в процедуру, должна быть совместима с параметром, но не обязательно должна быть полностью идентичной.
25 сен 16, 17:24    [19705985]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
ВМоисеев
А если не сразу вызывать ХП из другой базы, а написать на C# в вызывающей базе промежуточную процедуру и из неё уже вызывать нужную ХП в вызываемой базе. Тогда промежуточная процедура есть клиент.

Не понял только как это поможет синхронизировать созданные типы Таблица в разных базах?

Мне нужно постоянно передавать таблицу на удаленный связанный SQL сервер. Таблицы небольшие - 1-100 записей с 10-12 полями разных типов. Очень обрадовался, когда прочитал о новой функции начиная с 2008 сервера и так же огорчился, когда понял, что в моем случае это не работает (((

Буду писать передачу через XML, так как реализованная на скорую руку передача по 1й записи (поля передаются как параметры) мне жутко не нравится...

Всем спасибо за обсуждение!
25 сен 16, 17:55    [19706027]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2518
>Odess, вчера, 17:55 [19706027]
>...Мне нужно постоянно передавать таблицу на удаленный связанный SQL сервер....

Я может быть что-то не понимаю, но ХП на C# передающего может содержать 2 connect.
В рамках 1-го закачиваешь содержимое SQL-таблицы в C#-таблицу.
В рамках второго вызываешь ХП удаленного сервера, с передачей табличного параметра.

С уважением,
Владимир.
26 сен 16, 02:59    [19706920]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Odess
Таблицы небольшие - 1-100 записей с 10-12 полями разных типов.

Если там не текстовые ноды размером с "Войну и мир", то для XML это ерунда, скорость обработки будет вполне приемлемой.
26 сен 16, 09:14    [19707192]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
ВМоисеев
В рамках 1-го закачиваешь содержимое SQL-таблицы в C#-таблицу.
В рамках второго вызываешь ХП удаленного сервера, с передачей табличного параметра.

Я плохо знаю C#, но не понимаю - разве вызов из C# процедуры удаленного сервера чем-то отличается от вызова из SQL процедуры? Я приводил пример сообщения SQL сервера:
автор
Сообщение 7380, уровень 16, состояние 1, процедура ExpRealNew, строка 37
Возвращающие табличные значения параметры не поддерживаются в удаленных вызовах между серверами.
26 сен 16, 10:06    [19707353]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
Odess
Member

Откуда: Одесса, Украина
Сообщений: 6089
Сон Веры Павловны
Если там не текстовые ноды размером с "Войну и мир", то для XML это ерунда, скорость обработки будет вполне приемлемой.

Там вообще нет текстовых нодов, только числовые и логические поля. 1 запись таблицы меньше 500 байт.
Уже сделал генерирование XML текста, теперь разбираюсь с парсингом в принимающей процедуре. Раньше с XML не работал.
26 сен 16, 10:09    [19707361]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
мне как-то табличные параметры больше понравились, да и читаемость запросов выше чем с xml

select * from schet
join selected on (schet.id=selected.id)
26 сен 16, 11:08    [19707645]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
энди,

для того что бы передать в процедуру таблицу как параметр, надо заводить отдельный тип, для того что бы воспользоваться xml надо прочитать хотя бы пару страниц хелпа и он вас перестанет пугать :) ну и никто не запретит внутри процедуры xml развернуть во временную/переменную таблицу
26 сен 16, 11:17    [19707687]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
ADx
Guest
Bulk во времянку.
26 сен 16, 11:25    [19707723]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
энди
Member

Откуда: Киров, Россия
Сообщений: 1253
TaPaK,

да он меня и не пугает вобщем-то
просто как бы при задаче передать в хранимку табличные данные логичнее использовать табличный параметр :)
иначе тогда зачем его вообще ввели? :) тупо передавали бы весь набор входных параметров как единый XML и все :)
26 сен 16, 12:01    [19707903]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Можно по-старинке - через временную таблицу.
Чем не альтернатива?
26 сен 16, 12:04    [19707922]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
энди
TaPaK,

да он меня и не пугает вобщем-то
просто как бы при задаче передать в хранимку табличные данные логичнее использовать табличный параметр :)
иначе тогда зачем его вообще ввели? :) тупо передавали бы весь набор входных параметров как единый XML и все :)

я не видел нигде(от слова никогда) использование табличных параметров, но мой опыт не идёт в сравнение с вашим.

автор
тупо передавали бы весь набор входных параметров как единый XML

у одного приличного предприятия видел реализацию всех процедур через параметр XML... у них вообще такой шаблон был...

и я согласен с alexeyvg
автор
Табличные параметры - кривая недоделка
26 сен 16, 12:07    [19707939]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
TaPaK
я не видел нигде(от слова никогда) использование табличных параметров
Я вот использую в нескольких местах.
26 сен 16, 12:10    [19707954]     Ответить | Цитировать Сообщить модератору
 Re: Передача массивов в хранимые процедуры  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
TaPaK
я не видел нигде(от слова никогда) использование табличных параметров
Я вот использую в нескольких местах.

я много чего не видел :) но мы если надо то делаем через временные таблицы
26 сен 16, 12:11    [19707962]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить