У меня проблема, и я не знаю, как ее решить, я искал в Интернете и нашел хороший совет, но не могу решить.
Это проблема: яу меня на компьютере запущен экземпляр 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