powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Execute a pass-through command against a linked server with OUTPUT
8 сообщений из 8, страница 1 из 1
Execute a pass-through command against a linked server with OUTPUT
    #40044698
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста...

Примерно такой запрос:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    declare @cnt int; select @cnt [@cnt];

    set @cmd = N' declare @cnt int; set @cnt =  (select count(*) ' 
              +N'  from MyBase.dbo.Table n WITH (NOLOCK) '
              +N'  where n.TYPE_DOC = ''С'');  select @cnt [@cnt]; '  ;

    execute (@cmd, @cnt OUTPUT) at [LinkedServer];

    select @cnt [@cnt], @cmd [@cmd];




Сервер - MSSQL 2019
Linked Server - MSSQL 2008
База и таблица на линкованном сервере есть.
На select @cnt [@cnt]; возвращается (в MSSS по крайней мере) к-во строк.

В вызывающем запросе - значение @cnt остаётся null . Где чего не хватает?

Укладывается в синтаксис . Ошибок при выполнении в студии нет.

По теме
Код: plaintext
Execute a pass-through command against a linked server with OUTPUT
нашёл псевдо-решение тут и немного тут , но предлагаемые варианты НЕ решают проблему. Разве что insert into @TempTbl execute (@cmd) at LinkedServer. Но я итак такое могу,- не интересно.

--------------------------
No ROM Basic...
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044699
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже такое не срабатывает:
Код: sql
1.
2.
3.
4.
5.
6.
7.
    declare @cntOut int, @cmd nvarchar(max); select @cntOut [@cntOut];
    set @cmd = N' declare @cnt int; set @cnt =  (select count(*) ' 
              +N'  from master.dbo.sysobjects n WITH (NOLOCK) '
              +N'   ) ;'
              +N' select @cnt [@cnt inside]; ' ; -- @cnt = 
    execute (@cmd, @cnt = @cntOut  OUTPUT) at [127.0.0.1];
    select @cntOut [@cntOut], @cmd [@cmd];



То есть от версии linked-сервера, похоже, не зависит ( Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64) Sep 24 2019 13:48:23 Copyright (C) 2019 Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> )
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044709
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    declare @cnt int; select @cnt [@cnt];

    set @cmd = N' declare @cnt int; set @cnt =  (select count(*) ' 
              +N'  from MyBase.dbo.Table n WITH (NOLOCK) '
              +N'  where n.TYPE_DOC = ''С'');  set ? = @cnt ; '  ;

    execute (@cmd, @cnt OUTPUT) at [LinkedServer];

    select @cnt [@cnt], @cmd [@cmd];
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044716
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
...

Код: sql
1.
2.
3.
4.
5.
6.
    declare @cntOut int, @cmd nvarchar(max);
    set @cmd = N' declare @cnt int; select @cnt =count(*) ' 
              +N'  from master.dbo.sysobjects n WITH (NOLOCK);'
              +N' set ? = @cnt ; ' ; 
    execute (@cmd, @cntOut  OUTPUT) at [127.0.0.1];
    select @cntOut [@cntOut], @cmd [@cmd];



Спасибо! Сработало на связках "2019 - 2008" и "2019-2019" .

Можно я этот пример в Microsoft отправлю?
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044717
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SIMPLicity_, как желаете
я его не придумывал, просто Вы не до конца правильно написали запрос
Ответ был в Вашей же ссылке
Код: sql
1.
EXEC ('exec beh_dbums_test.dbo.MI_LOG_INFO ?, ?, ? OUTPUT', @proc_nm, @step_nm, @step_key OUTPUT) AT mi_loopback



т.е, чтобы передать параметр внутр запроса для связанного сервера, параметры указывается там знаком "?" и по порядку
одноименные парамтеры внутри и снаружи никак не взаимосвязаны
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044720
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HandKot
SIMPLicity_, как желаете
я его не придумывал, просто Вы не до конца правильно написали запрос
Ответ был в Вашей же ссылке ...

т.е, чтобы передать параметр внутри запроса для связанного сервера, параметры указывается там знаком "?" и по порядку.

Одноименные параметры внутри и снаружи никак не взаимосвязаны


Я точки и переносы правильно же расставил?

Для процедур у меня всё именно так и получалось (и это очевидно следовало из MS-справки). Не ожидал, что именно так работает с возвратом значения в переменную из простого запроса. Хотя и хелп и приведённую ссылку просмотрел по несколько раз. Что-то в голове крутилось про "неявное связывание" и т.д...,- и что это тут не подходит...

Спасибо огромное!
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044725
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
    declare @cnt int; select @cnt [@cnt];

    set @cmd = N' /*declare @cnt int;*/ set @cnt =  (select count(*) ' 
              +N'  from MyBase.dbo.Table n WITH (NOLOCK) '
              +N'  where n.TYPE_DOC = ''С'');  select @cnt [@cnt]; '  ;

    exec [LinkedServer]..sys.sp_executesql @cmd, N'@cnt int output', @cnt output;

    select @cnt [@cnt], @cmd [@cmd];
...
Рейтинг: 0 / 0
Execute a pass-through command against a linked server with OUTPUT
    #40044988
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, работает даже без описания переменной внутри удалённого запроса:

Код: sql
1.
2.
3.
4.
5.
    declare @cntOut int, @cmd nvarchar(max);
    set @cmd = N' select ? =count(*) ' 
              +N'  from master.dbo.sysobjects n WITH (NOLOCK);'; 
    execute (@cmd, @cntOut  OUTPUT) at [127.0.0.1];
    select @cntOut [@cntOut], @cmd [@cmd]; 



Проверено на связках: 2019 - 2019 и 2019 - 2008(linked)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Execute a pass-through command against a linked server with OUTPUT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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