Проблема выполнения хранимой процедуры внутри другой хранимой процедуры со связанного сервера - PullRequest
0 голосов
/ 12 октября 2019

У меня проблема, и я не знаю, как ее решить, я искал в Интернете и нашел хороший совет, но не могу решить.

Это проблема: яу меня на компьютере запущен экземпляр SQL Server, и я подключил к нему один из главных серверов SRVOLD\SQLDESA. Я хочу выполнить хранимые процедуры на главном сервере из экземпляра SQL Server моего компьютера и вставить результаты в новую таблицу. Я нашел идеальный способ сделать это, используя следующее:

SELECT *   
INTO Bank   
FROM OPENQUERY([SRVOLD\SQLDESA],  
               'EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')   
GO  

Существует важная информация об этом сервере, его версия SQL Server 2008. Имейте это в виду на потом.

Okпоэтому мне удалось выполнить эту хранимую процедуру, но я кое-что выяснил, оказалось, что внутри этой хранимой процедуры есть выполнение другой хранимой процедуры, проверьте это:

1-я хранимая процедура:

CREATE PROCEDURE Bank.usp_GetTDcodes 
    (@code TINYINT = NULL, @qty TINYINT = NULL)
WITH ENCRYPTION 
AS
    DECLARE @@msg VARCHAR(100)
    DECLARE @@OK INT
    DECLARE @@today CHAR(30)

    SELECT @@today = CONVERT(VARCHAR(30), GETDATE(), 112) + ' ' +
                     CONVERT(VARCHAR(30), GETDATE(), 8)

    SELECT bnk_code, bnk_descr
    FROM CODBNK
    WHERE bnk_code < 50

    EXECUTE @@OK = Bank.usp_WriteEvent  @qty, @code, @@today, 500

    IF @@OK <> 0
        RETURN @@OK

RETURN 0
GO

Теперь давайте посмотрим на 2-ю хранимую процедуру:

CREATE PROCEDURE Bank.usp_WriteEvent
    (@code TINYINT = NULL, 
     @qty TINYINT = NULL,   
     @date DATETIME = NULL,     
     @number SMALLINT = NULL, 
     @ideve INT = 0 OUTPUT)
WITH ENCRYPTION
AS
    DECLARE @@sdate VARCHAR(30)
    DECLARE @@ret SMALLINT

    INSERT INTO Event (eve_code, eve_qty, eve_date, eve_number)
    VALUES (@code, @qty, @date, @number)

    SET @@ret = @@error

    IF @@ret = 0
    BEGIN
        SELECT @ideve = @@IDENTITY

        SELECT @@sdate = CONVERT(VARCHAR(30), @date, 112) +  ' ' +
                         VARCHAR(30), @date, 8) 
    END
    ELSE 
        RETURN @@ret
GO

Когда я выполнил 1-ю хранимую процедуру, я смог вставить ее результат в новую таблицу, но я надеялся найти вставленную новую строкув таблице Event, потому что это ожидаемый результат при выполнении 2-й хранимой процедуры.

Поэтому я начал поиск в Интернете и смог добиться этого, выполнив следующее:

SELECT *   
INTO Bank   
FROM OPENQUERY([SRVTEST\SQLDESA],  
               'SET FMTONLY OFF;SET NOCOUNT ON;EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')   
GO  

Итак, SET FMTONLY OFF;SET NOCOUNT ON сработало, и я был счастлив. Но что-то случилось ...

Мне нужно было выполнить ту же хранимую процедуру, но на этот раз добавив новый связанный сервер SRVNEW\SQLDESA. Версия этого сервера - 2012, поэтому новое решение не сработало. Я продолжал пробовать и пробовать разные способы, есть только один способ заставить это работать и заключается в следующем:

EXEC [SRVNEW\SQLDESA].[Bank_Database].Bank.usp_GetTDcodes 1,5

Но это не работает для меня, потому что мне нужен 1-й результат хранимой процедуры в новую таблицу,И я не знаю его схемы, поэтому SELECT INTO работает лучше всего для меня. Я не знаю, что еще я могу сделать, может быть, OPENQUERY не работает? Нужно ли что-то менять?

PD: Я также пытался использовать OPENROWSET, тоже не сработало.

Заранее спасибо, и хорошего дня! Мир!

Некоторые ссылки: http://www.sommarskog.se/share_data.html#OPENQUERY

...