我正在尝试构建一个存储过程,它将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。
随时告诉我我的做法是错的。
答案 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