【问题标题】:How to pass a parameter to a stored procedure which in turn pass this parameter value calling another stored procedure?如何将参数传递给存储过程,该存储过程又将这个参数值传递给另一个存储过程?
【发布时间】:2020-01-03 20:32:33
【问题描述】:

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

有什么方法可以调用带有参数值的 SPA,该参数值将传递给 SPB 执行?请参阅下面的示例,它不起作用。但这说明了这个想法。我有一个错误

必须声明标量变量“@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-server


【解决方案1】:

不要使用动态 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

【讨论】:

  • 我不确定这个解决方案是否适合我。澄清一下,我的 SPB 实际上是一个 R 脚本,最后一条语句如下。结果集((ID1 INT,ID2 INT,[时间]日期,预测十进制(10,4),lo95十进制(10,4),hi95十进制(10,4),运行时间));去
【解决方案2】:

你可以像这样使用动态 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

【讨论】:

  • 此解决方案有效。但是,我很难弄清楚括号左侧的 3 是什么。 ''EXEC dbo.SPB @paramID1=' + convert(varchar(10),@param1) + ''')'
  • 第一个需要在“+”之后开始一个新的字符串。按照 OPENROWSET 的要求,需要接下来的 2 个以确保在呈现字符串时将 sql 字符串用单引号括起来。然后,我们需要一个关闭括号来关闭 OPENROWSET 函数。最后,我们有一个 ' 来关闭字符串。一个 ' 用于转义另一个 '。更多细节在这里:*.com/questions/1586560/…
  • 但是convert(varchar(10),@param1)之后没有新字符串了!
  • @FCHLuk 有。您需要关闭 "OPENROWSET(" 的开头括号,并且 "EXEC" 语句必须用单引号括起来。
  • 那么你的意思是新字符串是第一个 ' 后面的 '' (两个单引号)?