2013-03-07 53 views
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。

隨時告訴我,我的做法是錯誤的。

回答

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 
+0

這工作!非常感激。 – 2013-03-07 22:32:17