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

Откуда: Екб
Сообщений: 1194
Доброго времени суток!
Применительно к MS SQL 2008 R2, хотел сделать вот такое. На удаленном сервере создаю табличный тип, процедуру с входным параметром данного типа. Затем мне надо с другого сервера вызвать эту процу, передать ей в качестве параметра табличную переменную и получить данные (просто юзать многоэтажный запрос джойнящий данную табличную переменную с таблицами Linked Servera работает небыстро, была мысль ускорить).

При попытке создать табл переменную с типом с удаленного сервера получаю е очень понятное -
The type name 'RemoteServer1.DB.DBO' contains more than the maximum number of prefixes. The maximum is 1.

Пытаюсь гуглить сообщение вкупе с LinkeServer, вижу обходные решения проблем, типа а передавайте ИД по которому табличку можно выбрать с удаленного сервака (вместо самой таблички). Правильно ли я понимаю, что через LinkedServer процус табличным параметром запустить невозможно?
29 ноя 17, 09:43    [20990578]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
aleks222
Guest
denis_viktorovich
Доброго времени суток!
Применительно к MS SQL 2008 R2, хотел сделать вот такое. На удаленном сервере создаю табличный тип, процедуру с входным параметром данного типа. Затем мне надо с другого сервера вызвать эту процу, передать ей в качестве параметра табличную переменную и получить данные (просто юзать многоэтажный запрос джойнящий данную табличную переменную с таблицами Linked Servera работает небыстро, была мысль ускорить).

При попытке создать табл переменную с типом с удаленного сервера получаю е очень понятное -
The type name 'RemoteServer1.DB.DBO' contains more than the maximum number of prefixes. The maximum is 1.

Пытаюсь гуглить сообщение вкупе с LinkeServer, вижу обходные решения проблем, типа а передавайте ИД по которому табличку можно выбрать с удаленного сервака (вместо самой таблички).

3. Правильно ли я понимаю, что через LinkedServer процус табличным параметром запустить невозможно?


Мутность вашей логики пугает.

1. С какой радости сервер должен использовать определение типа с ДРУГОГО сервера?
2. Даже если этот бред бы осуществился... как сервер может получить доступ к временной таблице ДРУГОГО сервера.
3. Неправильно понимаешь.
3.1. Создать табличку-параметр на linked-сервере.
3.2. Заполнить яко надо.
3.3. Передать параметром процедуре.
29 ноя 17, 10:10    [20990707]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
aleks222


Наверно не так описал, Чуть поточнее - на том серваке где происходит расчет у меня есть набор из айдишников (в виде табличной переменной), к этому набору мне надо подтянуть данные из базы на линкованом сервере, прямым запросом ' "@MyList List inner join RemoteServer1.DB.dbo.Table1...' это работает, но медленно, таблиц несколько, в плане запроса вижу 99 % стоимости - Remote Query. Поскольку непосредственно на удаленном серваке такой же запрос отрабатывает на порядки быстрее, мне показалось логичным на удаленном сервере создать процедуру, передавать в нее свою табличную переменную и получать результат.

-- на удаленном и на локальном создал тип 
create type  [dbo].temp_tree_id_type as table (tree_id int, Quan1 float, QuanAll float)

-- на удаленном создана процедура 
CREATE procedure [dbo].GetDateTree(
@temp_tree_id [dbo].temp_tree_id_type READONLY)
as 
....

Пытаюсь запустить на основном 

declare @temp_tree_id [dbo].temp_tree_id_type 

exec RemoteServer1.DB.DBO.GetDateTree @temp_tree_id

получаю ошибку
Сообщение 7380, уровень 16, состояние 1, строка 44
Table-valued parameters are not allowed in remote calls between servers.
29 ноя 17, 14:47    [20992140]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

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

если не рассматривать вариант сначала вставки на удалённый, потом выполнения, то я бы передавал через xml, если значений "приемлемое" количество
29 ноя 17, 14:52    [20992169]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
denis_viktorovich,
Пробовал также просто, без типа создавать табличную переменную той же структуры и передавать ее, но ожидаемо получил
The attempt by the provider to pass remote stored procedure parameters to remote server ''RemoteServer1' failed. Verify that the number of parameters, the order, and the values passed are correct.
29 ноя 17, 14:54    [20992185]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
TaPaK,
От нескольких сотен, до ~15 К записей.
29 ноя 17, 14:57    [20992205]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
denis_viktorovich,

Вообще то да, зарапартовался. При таком объеме самое то записывать в некую таблицу на удаленном серваке, потом передавать в процедуру ИД.
29 ноя 17, 15:03    [20992248]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
denis_viktorovich
TaPaK,
От нескольких сотен, до ~15 К записей.

та имхо не проблема, одна очень не маленькая контора вообще только на xml и живёт с огромной нагрузкой.
зы А почему с линка не забрать данные для расчёта?
29 ноя 17, 15:03    [20992251]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
denis_viktorovich,
Но в общем случае, если бы объем данных был поменьще, отправить на удаленный сервер в качестве параметра,
табличную переменную созданную на локальном не получится?
29 ноя 17, 15:06    [20992268]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
TaPaK,
там начиная с моей переменной с айдишниками последовательная связка связка по ключам из 8 довольно больших таблиц.
29 ноя 17, 15:15    [20992320]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
TaPaK,

Т.е. я как раз и забираю нужные данные оттуда, но хотел немного оптимизировать процесс.
29 ноя 17, 15:16    [20992326]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

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

вариант с xml вполне себе простой, пробуйте
29 ноя 17, 15:20    [20992357]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
aleks222
Guest
denis_viktorovich

табличную переменную созданную на локальном не получится?


denis_viktorovich
получаю ошибку
Сообщение 7380, уровень 16, состояние 1, строка 44
Table-valued parameters are not allowed in remote calls between servers.


Чукча явно писатель.
30 ноя 17, 11:29    [20994699]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
aleks222
denis_viktorovich

табличную переменную созданную на локальном не получится?


denis_viktorovich
получаю ошибку
Сообщение 7380, уровень 16, состояние 1, строка 44
Table-valued parameters are not allowed in remote calls between servers.


Чукча явно писатель.

чукча, ты ж сам ему насоветовал
30 ноя 17, 11:35    [20994729]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
denis_viktorovich
denis_viktorovich,
Но в общем случае, если бы объем данных был поменьще, отправить на удаленный сервер в качестве параметра,
табличную переменную созданную на локальном не получится?

Вопрос терминологии, а не реализации.

Отправить user-defined type не получится. Отправить JSON или XML (любой другой приятный способ сериализации), или "указатель" на таблицу, на УДАЛЕННОМ сервере, с нужными параметрами - получится
30 ноя 17, 11:40    [20994760]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
aleks222
Guest
TaPaK
aleks222
пропущено...


пропущено...


Чукча явно писатель.

чукча, ты ж сам ему насоветовал


Не лги.
30 ноя 17, 13:18    [20995144]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
aleks222
TaPaK
пропущено...

чукча, ты ж сам ему насоветовал


Не лги.


ты должен был в лучших традициях как обычно o-o делает вставить эту картинку
+

Картинка с другого сайта.
30 ноя 17, 13:41    [20995227]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
TaPaK,

Да, дошли руки, попробовал переделать. Собственно пишет -
"Xml data type is not supported as a parameter to remote calls."
5 дек 17, 16:30    [21008060]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

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

Да, дошли руки, попробовал переделать. Собственно пишет -
"Xml data type is not supported as a parameter to remote calls."

xml формат, тип VARCHAR
5 дек 17, 16:45    [21008138]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
пока остановился на варианте с таблицей, т.е. записываю свои Ид-шники в табличку с ИД сессии, потом при удаленном запуске процедуры передаю этот ИД сессии.
5 дек 17, 16:49    [21008162]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
TaPaK,

create procedure [dbo].[GetTPDate](@tr_id xml)


сработало правда в виде -
set @CMD2='exec [DB].[dbo].[GetTPDate] '''+cast(@tr_id as varchar(max))+''''

exec(@CMD2) at [RemoteServ1]


но Varchar(max) может не хватить.....
5 дек 17, 16:56    [21008184]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
denis_viktorovich

но Varchar(max) может не хватить.....

2Gb маловато будет?

а может, это не очень хорошая идея передавать такие объемы в виде параметра?
табличные параметры вообще в 1 строку оцениваются,
представляю, какой классный будет план,
оптимизированный под 1 строку, а там на самом деле данных более 2Гб
5 дек 17, 17:03    [21008217]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
Yasha123
denis_viktorovich
но Varchar(max) может не хватить.....

2Gb маловато будет?

а может, это не очень хорошая идея передавать такие объемы в виде параметра?
табличные параметры вообще в 1 строку оцениваются,
представляю, какой классный будет план,
оптимизированный под 1 строку, а там на самом деле данных более 2Гб


Зарапартовался, конечно varchar(max) хватает с избытком, кроме того пересмотрев вопрос, объем данных еще уменьшился. XML-ка у меня парсится и заливается во времянку, создается индекс. И основные запросы выполняются уже в джойне с ней.
22 янв 18, 08:24    [21125252]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
denis_viktorovich
Member

Откуда: Екб
Сообщений: 1194
Но сейчас, с большим объемом данных снова уткнулся в вопрос производительности, за которую и боролся.
Данные с удаленного сервака я забираю при помощи инсерта их хранимки
Insert into #Temp_table exec  MyLinkedServer.MyBase.dbo.Procedure1 @tr_string
.
Таких вызовов в хранимке два, и в плане запроса я вижу, что стоимость их в сумме составляет порядка 75 % от всей процедуры.
Причем, запуская на удаленном сервере, вижу что она выполняется довольно шустро, в плане никаких необычных задержек не вижу.
На рабочем же , как только перед exec MyLinkedServer.MyBase.dbo.Procedure1 @tr_string появляется Insert into #Temp_table, в плане запроса вижу строку вида (select * from {IRowset 0xC0...}) с большой стоимостью.
Как получить более детальную информацию о задержке при вставке во времянку?
22 янв 18, 09:22    [21125386]     Ответить | Цитировать Сообщить модератору
 Re: процедура на LinkedServer с табличным параметром.  [new]
TaPaK
Member

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

1. Конструкция Insert into exec жутко забагованая лучше вообще не трогать :)
2. Это всё встаёт в в DTC
3. Забирать лучше SELECT ... FROM OPENQUERY(... exec ) ну и insert либо в созданную либо SELECT INTO
22 янв 18, 10:42    [21125601]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить