Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / процедура на LinkedServer с табличным параметром. / 25 сообщений из 28, страница 1 из 2
29.11.2017, 09:43
    #39561046
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
Доброго времени суток!
Применительно к 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 процус табличным параметром запустить невозможно?
...
Рейтинг: 0 / 0
29.11.2017, 10:10
    #39561063
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
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. Передать параметром процедуре.
...
Рейтинг: 0 / 0
29.11.2017, 14:47
    #39561304
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
aleks222

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- на удаленном и на локальном создал тип 
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.
...
Рейтинг: 0 / 0
29.11.2017, 14:52
    #39561308
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich,

если не рассматривать вариант сначала вставки на удалённый, потом выполнения, то я бы передавал через xml, если значений "приемлемое" количество
...
Рейтинг: 0 / 0
29.11.2017, 14:54
    #39561312
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
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.
...
Рейтинг: 0 / 0
29.11.2017, 14:57
    #39561313
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaK,
От нескольких сотен, до ~15 К записей.
...
Рейтинг: 0 / 0
29.11.2017, 15:03
    #39561315
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich,

Вообще то да, зарапартовался. При таком объеме самое то записывать в некую таблицу на удаленном серваке, потом передавать в процедуру ИД.
...
Рейтинг: 0 / 0
29.11.2017, 15:03
    #39561316
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovichTaPaK,
От нескольких сотен, до ~15 К записей.
та имхо не проблема, одна очень не маленькая контора вообще только на xml и живёт с огромной нагрузкой.
зы А почему с линка не забрать данные для расчёта?
...
Рейтинг: 0 / 0
29.11.2017, 15:06
    #39561318
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich,
Но в общем случае, если бы объем данных был поменьще, отправить на удаленный сервер в качестве параметра,
табличную переменную созданную на локальном не получится?
...
Рейтинг: 0 / 0
29.11.2017, 15:15
    #39561327
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaK,
там начиная с моей переменной с айдишниками последовательная связка связка по ключам из 8 довольно больших таблиц.
...
Рейтинг: 0 / 0
29.11.2017, 15:16
    #39561328
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaK,

Т.е. я как раз и забираю нужные данные оттуда, но хотел немного оптимизировать процесс.
...
Рейтинг: 0 / 0
29.11.2017, 15:20
    #39561333
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich,

вариант с xml вполне себе простой, пробуйте
...
Рейтинг: 0 / 0
30.11.2017, 11:29
    #39561828
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich
табличную переменную созданную на локальном не получится?

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

Чукча явно писатель.
...
Рейтинг: 0 / 0
30.11.2017, 11:35
    #39561835
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
aleks222denis_viktorovich
табличную переменную созданную на локальном не получится?

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

Чукча явно писатель.
чукча, ты ж сам ему насоветовал
...
Рейтинг: 0 / 0
30.11.2017, 11:40
    #39561842
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovichdenis_viktorovich,
Но в общем случае, если бы объем данных был поменьще, отправить на удаленный сервер в качестве параметра,
табличную переменную созданную на локальном не получится?
Вопрос терминологии, а не реализации.

Отправить user-defined type не получится. Отправить JSON или XML (любой другой приятный способ сериализации), или "указатель" на таблицу, на УДАЛЕННОМ сервере, с нужными параметрами - получится
...
Рейтинг: 0 / 0
30.11.2017, 13:18
    #39561909
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaKaleks222пропущено...


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


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

Не лги.
...
Рейтинг: 0 / 0
30.11.2017, 13:41
    #39561916
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
aleks222TaPaKпропущено...

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

Не лги.

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


...
Рейтинг: 0 / 0
05.12.2017, 16:30
    #39564549
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaK,

Да, дошли руки, попробовал переделать. Собственно пишет -
"Xml data type is not supported as a parameter to remote calls."
...
Рейтинг: 0 / 0
05.12.2017, 16:45
    #39564561
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovichTaPaK,

Да, дошли руки, попробовал переделать. Собственно пишет -
"Xml data type is not supported as a parameter to remote calls."
xml формат, тип VARCHAR
...
Рейтинг: 0 / 0
05.12.2017, 16:49
    #39564565
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
пока остановился на варианте с таблицей, т.е. записываю свои Ид-шники в табличку с ИД сессии, потом при удаленном запуске процедуры передаю этот ИД сессии.
...
Рейтинг: 0 / 0
05.12.2017, 16:56
    #39564571
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
TaPaK,

Код: sql
1.
create procedure [dbo].[GetTPDate](@tr_id xml)



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

exec(@CMD2) at [RemoteServ1]



но Varchar(max) может не хватить.....
...
Рейтинг: 0 / 0
05.12.2017, 17:03
    #39564575
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich
но Varchar(max) может не хватить.....
2Gb маловато будет?

а может, это не очень хорошая идея передавать такие объемы в виде параметра?
табличные параметры вообще в 1 строку оцениваются,
представляю, какой классный будет план,
оптимизированный под 1 строку, а там на самом деле данных более 2Гб
...
Рейтинг: 0 / 0
22.01.2018, 08:24
    #39588048
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
Yasha123denis_viktorovichно Varchar(max) может не хватить.....
2Gb маловато будет?

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

Зарапартовался, конечно varchar(max) хватает с избытком, кроме того пересмотрев вопрос, объем данных еще уменьшился. XML-ка у меня парсится и заливается во времянку, создается индекс. И основные запросы выполняются уже в джойне с ней.
...
Рейтинг: 0 / 0
22.01.2018, 09:22
    #39588079
denis_viktorovich
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
Но сейчас, с большим объемом данных снова уткнулся в вопрос производительности, за которую и боролся.
Данные с удаленного сервака я забираю при помощи инсерта их хранимки
Код: sql
1.
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...}) с большой стоимостью.
Как получить более детальную информацию о задержке при вставке во времянку?
...
Рейтинг: 0 / 0
22.01.2018, 10:42
    #39588141
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
процедура на LinkedServer с табличным параметром.
denis_viktorovich,

1. Конструкция Insert into exec жутко забагованая лучше вообще не трогать :)
2. Это всё встаёт в в DTC
3. Забирать лучше SELECT ... FROM OPENQUERY(... exec ) ну и insert либо в созданную либо SELECT INTO
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / процедура на LinkedServer с табличным параметром. / 25 сообщений из 28, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]