Sql 从链接服务器在另一个存储过程中执行存储过程时出现问题

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

我有一个问题,我不知道如何解决它,我搜索了网络,找到了很好的建议,但我不能解决它

这就是问题所在:我的电脑上运行着一个SQL Server实例,我将一个主服务器
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
,新行不在那里