0

我正在尝试构建一个存储过程,它将 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。

并随时告诉我我的方法都是错误的。

4

1 回答 1

1

您可以创建一个临时表并将 exec(@sql) 用于插入语句,而不是尝试直接通过动态 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
于 2013-03-07T19:30:06.023 回答