从动态SQL返回的存储过程字符串参数的范围问题

时间:2012-06-07 17:30:35

标签: sql tsql

我有一个存储过程,用于创建需要汇编描述的库存交易。由于其他库存存储过程也需要类似地组装它们的描述,我试图创建一个帮助程序存储过程。

此帮助程序将使用标准参数并构造描述。我遇到的麻烦是将字符串Description返回到库存交易。

Inventory事务以这种方式调用帮助程序:

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生成描述。问题是帮助代码生成了正确的描述,但没有将其作为输出传回。

任何人都知道为什么或在哪里我失去了返回输出描述的范围?

1 个答案:

答案 0 :(得分:4)

您忘了分配变量。尝试:

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

此外,更改声明动态脚本参数的部分(@TransDesc),否则您将遇到另一个问题。目前,参数声明如下:

@TransDesc varchar output

which is equivalent

@TransDesc varchar(1) output

最有可能的,应该是

@TransDesc varchar(256) output

代替。