Sql server 如何将一个参数传递给一个存储过程,而存储过程又通过调用另一个存储过程来传递这个参数值?
我正在使用MS SQL Server 2017。假设我有两个存储过程SPA和SPB。它们都接受一个参数(例如,都是整数参数) 有没有办法用传递给SPB执行的参数值调用SPA?请参阅下面的示例,它不起作用。但这说明了这个想法。我犯了个错误 必须声明标量变量“@param1” 当我运行时,我希望100是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
@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”语句必须用单引号括起来。那么,您的意思是新字符串是第一个“”后面的“”(两个单引号)?