2009-01-20 116 views
3

早上好,通過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

回答

3

請問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

0

試試這個:

SET @spToExec = 'EXEC SPINSVALUE' + REPLACE(@guid, '-', '_') + ' @returnValue OUT'   
EXEC sp_executeSQL @spToExec, N'@returnValue int OUTPUT', @returnValue OUTPUT 
0

我想添加到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列表中的名稱)來設置參數,以避免在多個參數中出現混淆。

0

抱歉耽擱: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 
0
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"