从变量查询中返回out参数

时间:2013-03-07 03:11:44

标签: tsql

我正在尝试构建一个存储过程,它将ID转换为给定数据库中任何键的可显示值。为此,我添加了一个名为LookupMap的表,它指定了用于KeyField和DisplayField的字段。

TableName     KeyField      DisplayField
---------     --------      ------------
Company       CompanyId     CompanyName
Location      LocationId    LocationName

我想传入一个表名和一个Key值,然后返回Display值。以下是我尝试过的失败:

Create Procedure [dbo].[GetLookup]
@TableName varchar(50), 
@Key varchar(50),
@DisplayValue varchar(255) out
AS
BEGIN
DECLARE @DisplayField varchar(50)
DECLARE @IdField varchar(50)
Select @DisplayField = DisplayField, @IdField = IdField 
    From LookupMap where TableName = @TableName

DECLARE @sql NVARCHAR(500)
SET @sql = N'SET @DisplayValue = (SELECT ' + @DisplayField + N' FROM ' + @TableName + 
               N' WHERE ' + @IdField + N' = ''' + @Key + N''')'

Print @sql
Set @DisplayValue = (EXEC (@sql))

END

一切都可以到达最后一行,但我不知道如何从动态查询中获取值并将其分配给out参数。此外,虽然我知道密钥是唯一的,并且只有一个匹配,但我意识到我需要将某个表结果分配给varchar。

随时告诉我我的做法是错的。

1 个答案:

答案 0 :(得分:1)

您可以创建临时表,并使用exec(@sql)作为insert语句,而不是尝试直接通过动态SQL设置变量。

所以

    CREATE TABLE #Result (result varchar(50))

    DECLARE @sql NVARCHAR(500)
            SET @sql = N'SELECT ' + @DisplayField + N' FROM ' + @TableName + 
                   N' WHERE ' + @IdField + N' = ''' + @Key + N''''

    INSERT INTO #Result
    EXEC(@sql)

    SELECT @DisplayField = result FROM #Result