powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / процедура на LinkedServer с табличным параметром.
25 сообщений из 28, страница 1 из 2
процедура на LinkedServer с табличным параметром.
    #39561046
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, вижу обходные решения проблем, типа а передавайте ИД по которому табличку можно выбрать с удаленного сервака (вместо самой таблички). Правильно ли я понимаю, что через LinkedServer процус табличным параметром запустить невозможно?
...
Рейтинг: 0 / 0
процедура на LinkedServer с табличным параметром.
    #39561063
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
процедура на LinkedServer с табличным параметром.
    #39561304
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
процедура на LinkedServer с табличным параметром.
    #39561308
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich,

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

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

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

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

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

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

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

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

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


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


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

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

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

Не лги.

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


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

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

Да, дошли руки, попробовал переделать. Собственно пишет -
"Xml data type is not supported as a parameter to remote calls."
xml формат, тип VARCHAR
...
Рейтинг: 0 / 0
процедура на LinkedServer с табличным параметром.
    #39564565
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока остановился на варианте с таблицей, т.е. записываю свои Ид-шники в табличку с ИД сессии, потом при удаленном запуске процедуры передаю этот ИД сессии.
...
Рейтинг: 0 / 0
процедура на LinkedServer с табличным параметром.
    #39564571
denis_viktorovich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
процедура на LinkedServer с табличным параметром.
    #39564575
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denis_viktorovich
но Varchar(max) может не хватить.....
2Gb маловато будет?

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

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

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

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


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