Sql server 如何将一个参数传递给一个存储过程,而存储过程又通过调用另一个存储过程来传递这个参数值?

Sql server 如何将一个参数传递给一个存储过程,而存储过程又通过调用另一个存储过程来传递这个参数值?,sql-server,Sql Server,我正在使用MS SQL Server 2017。假设我有两个存储过程SPA和SPB。它们都接受一个参数(例如,都是整数参数) 有没有办法用传递给SPB执行的参数值调用SPA?请参阅下面的示例,它不起作用。但这说明了这个想法。我犯了个错误 必须声明标量变量“@param1” 当我运行时,我希望100是@paramID1的值 EXEC SPB @paramID1 = @param1 请告知。非常感谢 CREATE PROCEDURE SPA @param1 INT AS INS

我正在使用MS SQL Server 2017。假设我有两个存储过程SPA和SPB。它们都接受一个参数(例如,都是整数参数)

有没有办法用传递给SPB执行的参数值调用SPA?请参阅下面的示例,它不起作用。但这说明了这个想法。我犯了个错误

必须声明标量变量“@param1”

当我运行时,我希望100是
@paramID1
的值

EXEC SPB @paramID1 = @param1 
请告知。非常感谢

CREATE PROCEDURE SPA 
    @param1 INT
AS
    INSERT INTO tbl 
        SELECT a.* 
        FROM OPENROWSET('SQLNCLI', 'Server=(local);Trusted_Connection=yes;',
                'EXEC SPB @paramID1=@param1') AS a
GO

-- Usage:

EXEC SPA @param1 = 100;

不要使用动态SQL,而是使用显式语法。 以下是完整的工作脚本:

CREATE TABLE dbo.tbl (Name VARCHAR(10))
GO
CREATE PROCEDURE dbo.SPB (@param1 INT)
AS
BEGIN
    SELECT @param1
END;
GO
CREATE PROCEDURE dbo.SPA (@param1 INT)
AS
BEGIN
    INSERT INTO dbo.tbl (Name)
    EXEC dbo.SPB @param1 = @param1    
END;
GO
---------------usage---

EXEC dbo.SPA @param1=100;
EXEC dbo.SPA @param1=200;
EXEC dbo.SPA @param1=300;
SELECT * FROM dbo.tbl
GO

DROP TABLE dbo.tbl
DROP PROC dbo.SPA
DROP PROC dbo.SPB
结果:

Name
100
200
300

您可以使用动态sql,如下所示

CREATE PROCEDURE SPA @param1 INT
AS
BEGIN
    DECLARE @sql nvarchar(max)
    SET @sql='INSERT INTO tbl SELECT a.* 
            FROM OPENROWSET(
                   ''SQLNCLI'',
                   ''Server=(local);Trusted_Connection=yes;'',
                   ''EXEC dbo.SPB @paramID1=' + convert(varchar(10),@param1) + ''')'

     Exec(@sql)
END
GO

EXEC SPA @param1 =100;
GO

检查:为什么需要使用openrowset?为什么是动态sql?我不确定这个解决方案是否适合我。为了澄清,我的SPB实际上是一个R脚本,最后一条语句如下。结果集((ID1 INT,ID2 INT,[时间]日期,预测十进制数(10,4),lo95十进制数(10,4),hi95十进制数(10,4),运行时时间));明白了,这个解决办法行得通。然而,我很难找出括号左边的3是什么EXEC dbo.SPB@paramID1='+convert(varchar(10),@param1)+'''')第一个需要在“+”之后开始一个新字符串。按照OPENROWSET的要求,在呈现sql字符串时,需要使用下一个2来确保该字符串被单引号包围。然后,我们需要一个关闭参数来关闭OPENROWSET函数。最后,我们有一个单一的'关闭字符串。一个“用来逃避另一个”。这里有更多细节:但是转换后没有新字符串(varchar(10),@param1)@有。您需要从“OPENROWSET”()关闭开始部分,并且“EXEC”语句必须用单引号括起来。那么,您的意思是新字符串是第一个“”后面的“”(两个单引号)?