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

Откуда: Новосибирск
Сообщений: 358
Всем привет,
вопрос вот какой. Есть текущий и некий удаленный сервер MS SQL (он подключен как linked server). Суть в том, что вся активность инициируется с первого сервера, но вычисления и изменения в таблицах должны быть на удаленном сервере. В простейшем случае задача звучит так: в одной из баз того удаленного сервера есть хранимая процедура, я хочу вызвать ее удаленно (из скрипта, запущенного на текущем сервере). Возвращаемый результат не интересует, та процедура просто изменит таблицы в базе удаленного сервера. Главное, чтобы это происходило именно на нем, чтобы тот второй сервер нагружался вычислением, и данные не гонялись по сети.
Правильно ли я делаю, и есть ли разница между этими двумя вариантами?

Вариант 1
DECLARE @destserv varchar(max) = 'some_remote_mssql_server';
DECLARE @remoteProc varchar(max) = 'name of the stored procedure that we run in remote server';

EXEC sp_executeSQL @stmt = 'exec [' + @destserv + '].[tempdb].[dbo].[sp_executeSQL] @stmt = ' + @remoteProc 


Вариант 2
-//-

EXEC sp_executeSQL @stmt = 'exec [' + @destserv + '].[tempdb].[dbo].' + @remoteProc 


Спасибо
17 фев 16, 17:09    [18831113]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
BOL
Execute a stored procedure or function
[ { EXEC | EXECUTE } ]
{
[ @return_status = ]
{ module_name [ ;number ] | @module_name_var }
[ [ @parameter = ] { value
| @variable [ OUTPUT ]
| [ DEFAULT ]
}
]
[ ,...n ]
[ WITH <execute_option> [ ,...n ] ]
}
[;]
@module_name_var
Is the name of a locally defined variable that represents a module name.

E.Using EXECUTE with a stored procedure variable
The following example creates a variable that represents a stored procedure name.
Transact-SQL
DECLARE @proc_name varchar(30);
SET @proc_name = 'sys.sp_who';
EXEC @proc_name;
17 фев 16, 17:15    [18831176]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
module_name
Is the fully qualified or nonfully qualified name of the stored procedure or scalar-valued user-defined function to call. Module names must comply with the rules for identifiers. The names of extended stored procedures are always case-sensitive, regardless of the collation of the server.
A module that has been created in another database can be executed if the user running the module owns the module or has the appropriate permission to execute it in that database. A module can be executed on another server running SQL Server if the user running the module has the appropriate permission to use that server (remote access) and to execute the module in that database. If a server name is specified but no database name is specified, the SQL Server Database Engine looks for the module in the default database of the user.
17 фев 16, 17:18    [18831206]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Glory, это все понятно, речь о вызове хранимой процедуры, которая находится в базе на другом сервере, как вызвать ее так, чтобы она исполнялся удаленно, на том linked-сервере, где она находится, а не на текущем, откуда я ее вызвал.
17 фев 16, 17:21    [18831232]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

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

перечитайте ответы еще раз
17 фев 16, 17:22    [18831246]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Glory, не увидел второго сообщения сначала. Т.е. похоже, что варианты эквивалентны.
17 фев 16, 17:22    [18831250]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
Т.е. похоже, что варианты эквивалентны.

Ага, оба эквивалентно излишне.
17 фев 16, 17:24    [18831261]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Glory, ну а как правильно-то?
17 фев 16, 17:36    [18831333]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Glory,

EXEC ('[' + @destserv + '].[tempdb].[dbo].' + @remoteProc) 

так что ли?
17 фев 16, 17:37    [18831342]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
ну а как правильно-то?

Как в хелпе написано

DECLARE @proc_name varchar(50);
SET @proc_name = 'mylinkedserver.mydb.sys.sp_who';
EXEC @proc_name;
17 фев 16, 17:38    [18831348]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
TopSpace
Glory, ну а как правильно-то?

мдя...... може еще раз преречитаете ?
17 фев 16, 17:38    [18831351]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Ну а вот здесь https://technet.microsoft.com/ru-ru/library/ms175170(v=sql.105).aspx рекомендуется использовать sp_executeSQL
17 фев 16, 17:46    [18831385]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
рекомендуется использовать sp_executeSQL

А вы прочитали, для чего рекомендуется ?
17 фев 16, 17:48    [18831399]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Ребят, я вот правда не понимаю, зачем форум нужен? Для самоутверждения, или помощи? Я же не пришел "напишите за меня", привел варианты кода, выразил сомнения - есть силы пулять десяток сообщений, но сложно вместо этого одним постом из 5 предложений дать конкретный совет "лучше сделать вот так, потому что.."?
Читал конечно, просто с данной областью никогда не сталкивался (уже лет 5 как минимум с БД работаю вообще только через ORM), и опыт подсказывает, что могут быть свои подводные грабли, на которые либо придется наступить, либо перечитать гору доков (на что времени нет), либо, как я думал, спросить. Воистину, в российском IT царит дух амбициозного всезнайства, пойду на stackoverflow.
17 фев 16, 18:03    [18831488]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
но сложно вместо этого одним постом из 5 предложений дать конкретный совет "лучше сделать вот так, потому что.."?

какой еще более подробный ответ вам нужен ?
Вот пример из хелпа


DECLARE @proc_name varchar(50);
SET @proc_name = 'mylinkedserver.mydb.sys.sp_who';
EXEC @proc_name;

чего еще вам надо ?
17 фев 16, 18:05    [18831494]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
Воистину, в российском IT царит дух амбициозного всезнайства, пойду на stackoverflow.

Тупизма дух царит. И снобизма.
17 фев 16, 18:05    [18831498]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
TopSpace
Member

Откуда: Новосибирск
Сообщений: 358
Glory,
спасибо, конечно, на 5-м вашем сообщении этот код удалось получить. У вас имя процедуры записывается в переменную, у меня просто собирается строка - есть ли разница? Думаю нет. По моей ссылке рекомендация использовать sp_executeSQL вместо exec для любых вызовов хранимок (строится план и пр.), так? Или это будет работать медленнее, имеет какие-то свои минусы и пр. Много нюансов.
17 фев 16, 18:14    [18831548]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
TopSpace
у меня просто собирается строка - есть ли разница?

Собирается где ? В воздухе ?
В вашем первом посте точно также используются переменные

TopSpace
По моей ссылке рекомендация использовать sp_executeSQL вместо exec для любых вызовов хранимок (строится план и пр.), так?

Не так. Там нет ни слова про вызовы хранимых процедур
EXECUTE() и EXECUTE - это разные вещи.

Дух тупизма царит
17 фев 16, 18:18    [18831568]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
Glory
Member

Откуда:
Сообщений: 104751
DECLARE @proc_name1 varchar(50), @proc_name2 varchar(50), @proc_name3 varchar(50);
SET @proc_name1 = 'mylinkedserver'
SET @proc_name2 = 'sp_who'
SET @proc_name3 = @proc_name1 +'.mydb.sys.'+@proc_name2
EXEC @proc_name3;
17 фев 16, 18:20    [18831580]     Ответить | Цитировать Сообщить модератору
 Re: Подскажите с удаленным вызовом хранимой процедуры  [new]
MakLenaX
Member

Откуда: Toronto
Сообщений: 4
TopSpace,

stor proc always runs on SQL server where it resides, is not it?
No matter how you will call it, it will take linked server resources, it will not pull any data out of server unless it's stor proc output

just use Execute to run stor proc, sp_executeSQL more for dynamic SQL
17 фев 16, 19:45    [18832028]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить