通过sp_executesql执行存储过程

问题描述:

早上好,通过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,我认为这是一个坏主意,有很多特效做类似的事情,也许你需要重构

+0

不幸的是,存储过程需要2个参数。 ..一个输入和一个输出......当我在声明中补充说不再有效 – 2009-01-20 19:56:56

试试这个:

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"