Sql 从链接服务器在另一个存储过程中执行存储过程时出现问题
我有一个问题,我不知道如何解决它,我搜索了网络,找到了很好的建议,但我不能解决它 这就是问题所在:我的电脑上运行着一个SQL Server实例,我将一个主服务器Sql 从链接服务器在另一个存储过程中执行存储过程时出现问题,sql,sql-server,stored-procedures,linked-server,openquery,Sql,Sql Server,Stored Procedures,Linked Server,Openquery,我有一个问题,我不知道如何解决它,我搜索了网络,找到了很好的建议,但我不能解决它 这就是问题所在:我的电脑上运行着一个SQL Server实例,我将一个主服务器SRVOLD\SQLDESA链接到它。我想从PC的SQL server实例执行主服务器的存储过程,并将结果插入到新表中。我通过以下几点找到了完美的方法: SELECT * INTO Bank FROM OPENQUERY([SRVOLD\SQLDESA], 'EXEC Bank_Databas
SRVOLD\SQLDESA
链接到它。我想从PC的SQL server实例执行主服务器的存储过程,并将结果插入到新表中。我通过以下几点找到了完美的方法:
SELECT *
INTO Bank
FROM OPENQUERY([SRVOLD\SQLDESA],
'EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')
GO
EXEC [SRVNEW\SQLDESA].[Bank_Database].Bank.usp_GetTDcodes 1,5
有关于此服务器的重要信息,它的SQL server版本是2008。以后要记住这一点
好的,我设法执行了这个存储过程,但我发现了一些东西,在这个存储过程中有另一个存储过程的执行,请检查:
第一个存储过程:
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
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
当我执行第一个存储过程时,我能够将其结果插入到一个新表中,但我希望在表事件
中插入一个新行,因为这是执行第二个存储过程时的预期结果
因此,我开始在线搜索,并通过以下方式实现了这一目标:
SELECT *
INTO Bank
FROM OPENQUERY([SRVTEST\SQLDESA],
'SET FMTONLY OFF;SET NOCOUNT ON;EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')
GO
因此,设置为FMTONLY OFF;不算
成功了,我很高兴。但是发生了一些事
我需要执行相同的存储过程,但这次添加了一个新的链接服务器SRVNEW\SQLDESA
。此服务器的版本为2012,因此新的解决方案不起作用。我一直在尝试不同的方法,只有一种方法可以让它发挥作用,那就是:
SELECT *
INTO Bank
FROM OPENQUERY([SRVOLD\SQLDESA],
'EXEC Bank_Database.Bank.usp_GetTDcodes 1, 5')
GO
EXEC [SRVNEW\SQLDESA].[Bank_Database].Bank.usp_GetTDcodes 1,5
但它对我不起作用,因为我需要将第一个存储过程结果放入一个新表中。我不知道它的模式,这就是为什么selectinto
最适合我的原因。
我不知道我还能做什么,也许是OPENQUERY
不起作用?我需要换些别的东西吗
PD:我也试过使用OPENROWSET
也没用
提前谢谢,祝你有愉快的一天!
和平
一些参考资料:如果我理解正确,您在初次尝试时遇到的问题是未将新行插入
事件
表中。您是指PC或主SRVOLD\SQLDESA
服务器上的事件表吗?我希望将该行插入远程服务器事件
表中,因为这是进程运行的地方。您不能执行选择。。。进入在未使用OPENQUERY的
存储过程中,句点。@DanGuzman事件
表是主服务器SRVOLD\SQLDESA
,新行不在那里