通过sp_executesql执行存储过程
问题描述:
我正在尝试在另一个存储过程中执行存储过程。问题在于存储过程名称是在第一个过程中动态构建的。这里是我想要做的一个例子...
CREATE PROCEDURE SPINSVALUE_12345
@guid uniqueidentifier
AS
DECLARE @returnValue bit
DECLARE @spToExec NVARCHAR(255)
SET @returnValue = 0
WHILE (@returnValue=0)
BEGIN
SET @spToExec = 'SPINSVALUE_' + REPLACE(@guid, '-', '_')
... DO OTHER STUFF ...
EXEC sp_executeSQL @spToExec, N'@returnValue BIT OUTPUT', @returnValue OUTPUT
END
END
我似乎无法让sp_executeSQL工作。是否有可能以这种方式执行存储过程,并从OUTPUT参数中获取值?
预先感谢您的任何援助,
斯科特Vercuski
答
请问PROC有返回值或输出值? 这里有一个例子
create proc prBlatest
as
return 5
go
DECLARE @chvTableName VARCHAR(100),
@intTableCount INT,
@chvSQL NVARCHAR(100)
SELECT @chvTableName = 'prBlatest'
SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName
EXEC sp_executesql @chvSQL, N'@intTableCount INT OUTPUT', @intTableCount OUTPUT
SELECT @intTableCount
GO
BTW,我认为这是一个坏主意,有很多特效做类似的事情,也许你需要重构
答
试试这个:
SET @spToExec = 'EXEC SPINSVALUE' + REPLACE(@guid, '-', '_') + ' @returnValue OUT'
EXEC sp_executeSQL @spToExec, N'@returnValue int OUTPUT', @returnValue OUTPUT
答
我想添加到SQLMenace的答案。他的回答帮助我朝着正确的方向前进。在过程需要参数的情况下,它们必须在语句参数中声明。
create proc prBlatest @in int
as
return 5 + @in
go
DECLARE @chvTableName VARCHAR(100),
@intTableCount INT,
@chvSQL NVARCHAR(100)
SELECT @chvTableName = 'prBlatest'
SELECT @chvSQL = N'exec @intTableCount = ' + @chvTableName + ' @inputParam'
--NOTICE the @in parameter is declared in the statement parameter
EXEC sp_executesql @chvSQL, N'@inputParam int, @intTableCount INT OUTPUT'
, @inputParam = 5
, @intTableCount = @intTableCount OUTPUT
SELECT @intTableCount
GO
在这种情况下返回10的值。
可以使用名称(使用@params列表中的名称)来设置参数,以避免在多个参数中出现混淆。
答
抱歉耽搁:d,下面的代码完美地工作(对于N ..输出和输入参数)请尽量将(source):
CREATE PROCEDURE Myproc
@parm varchar(10),
@parm1OUT varchar(30) OUTPUT,
@parm2OUT varchar(30) OUTPUT
AS
SELECT @parm1OUT='parm 1' + @parm
SELECT @parm2OUT='parm 2' + @parm
GO
DECLARE @SQLString NVARCHAR(500)
DECLARE @ParmDefinition NVARCHAR(500)
DECLARE @parmIN VARCHAR(10)
DECLARE @parmRET1 VARCHAR(30)
DECLARE @parmRET2 VARCHAR(30)
SET @parmIN=' returned'
SET @SQLString=N'EXEC Myproc @parm,
@parm1OUT OUTPUT, @parm2OUT OUTPUT'
SET @ParmDefinition=N'@parm varchar(10),
@parm1OUT varchar(30) OUTPUT,
@parm2OUT varchar(30) OUTPUT'
EXECUTE sp_executesql
@SQLString,
@ParmDefinition,
@[email protected],
@[email protected] OUTPUT,@[email protected] OUTPUT
SELECT @parmRET1 AS "parameter 1", @parmRET2 AS "parameter 2"
go
drop procedure Myproc
答
DECLARE @SQL NVARCHAR(100)
DECLARE @return_value int
SET @SQL = '[dbo].[SpData] @id = 1'
EXECUTE sp_executesql @SQL ,N'@return_value INT OUTPUT', @return_value OUTPUT"
不幸的是,存储过程需要2个参数。 ..一个输入和一个输出......当我在声明中补充说不再有效 – 2009-01-20 19:56:56