Sql server 通过sp_executesql执行存储过程

Sql server 通过sp_executesql执行存储过程,sql-server,stored-procedures,Sql Server,Stored Procedures,我试图在另一个存储过程中执行一个存储过程。关键是存储过程名是在第一个过程中动态构建的。这是一个我正在尝试做的例子 CREATE PROCEDURE SPINSVALUE_12345 @guid uniqueidentifier AS DECLARE @returnValue bit DECLARE @spToExec NVARCHAR(255) SET @returnValue = 0 WHILE (@returnValue=0) BEGIN

我试图在另一个存储过程中执行一个存储过程。关键是存储过程名是在第一个过程中动态构建的。这是一个我正在尝试做的例子

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正常工作。是否可以以这种方式执行存储过程并从输出参数中获取值?

过程是否有返回值或输出值? 这里有一个例子

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
顺便说一句,我认为这是一个坏主意,有许多进程做类似的事情,也许你需要重构

试试这个:

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..输出和输入参数),请尝试此():


不幸的是,存储过程需要2个参数。。。一个输入和一个输出。。。当我在声明中加上“不再有效”时,我意识到这很古老,但我遇到了同样的问题,我无法通过谷歌找到太多帮助。如果其他人偶然发现了这篇文章,下面是我的诀窍。。。确保将参数列表添加到SQL字符串以及sp_executesql调用中。因此,在上面,您希望将
+'@intTableCount=@intTableCount'
添加到
'+@chvTableName'
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,
@parm=@parmIN,
@parm1OUT=@parmRET1 OUTPUT,@parm2OUT=@parmRET2 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"