2012-06-07 52 views
2

我有一個存儲過程,用於創建需要彙編描述的庫存事務。由於其他庫存存儲過程也需要類似地組裝它們的描述,因此我試圖創建一個輔助存儲過程。從動態SQL返回存儲過程字符串參數的範圍問題

該幫手將使用標準參數並構建描述。我遇到的麻煩是將字符串Description返回到庫存交易。

一個庫存交易調用助手這樣:

declare @TransDescription nvarchar(256) 
declare @TransDescOut nvarchar(256) 

EXEC [dbo].[sp_KF_Helpers_CreateInvTransDescription] 
    @TransactionTypeID, @UserName, @OwnerTypeID, @OwnerID, 
    @TransDesc = @TransDescOut OUTPUT 

SET @TransDescription = @TransDescOut 

然後我用@TransDescription作爲插入列數據的值。

助手代碼:

CREATE PROCEDURE [dbo].[sp_KF_Helpers_CreateInvTransDescription] 
    ( @TransactionTypeID int, 
     @UserName nvarchar(256), 
     @OwnerTypeID int, 
     @OwnerID int, 
     @TransDesc varchar(256) OUTPUT 
    ) 
    AS 
    BEGIN 
    SET NOCOUNT ON; 

declare @rslt int = 0 
declare @strTyepID varchar(256) = @TransactionTypeID 
declare @strOwnerID varchar(256) = @OwnerID 
declare @intOwnerTypeID int = @OwnerTypeID 
declare @OwnerStr varchar(256) = 'KF_' 
declare @OwnerIDStr varchar(256) = (select Description from KF_OwnerType where ID = @intOwnerTypeID) 

select @OwnerStr = @OwnerStr + @OwnerIDStr 
declare @sql1 nvarchar(4000) 

Select @sql1 = 'Select Top 1 (a.Description + '' - '' + ' + @OwnerStr + '.Name) TransDesc 
from KF_InventoryTransactionType a, KF_OwnerType c, ' + @OwnerStr + ' 
where a.ID = ' + @strTyepID + ' and ' 
+ @OwnerStr + '.ID = ' + @strOwnerID 

exec SP_EXECUTESQL @sql1, N'@TransDesc varchar output ', @TransDesc output 
End 

正如你所看到的,我使用動態SQL生成描述。問題是幫助代碼會生成正確的描述,但不會將其作爲輸出傳回。

任何人都知道我爲什麼或在哪裏丟失返回輸出描述的範圍?

回答

4

你忘了分配變量。嘗試:

select top 1 @TransDesc = a.Description + '' - '' + ' + @OwnerStr + '.Name 
... 

另外,更改你在哪裏聲明動態腳本(@TransDesc)的參數的一部分,或者你會遇到的另一個問題。目前,該參數被聲明如下:

@TransDesc varchar output 

which is equivalent

@TransDesc varchar(1) output 

最有可能的,它應該是

@TransDesc varchar(256) output 

代替。

+0

我已經做出了這些更正,但它仍然不會將描述返回到頂層。 –

+0

試試'SELECT @ TransDescOut'而不是'SET'? – Andomar

+0

在調試中,我注意到@TransDescOut沒有值。因此SELECT或SET並沒有什麼不同。 問題可能與助手的執行方式有關嗎? –