2012-05-16 32 views
0

如何在标量值函数中使用变量作为列名称?标量值函数中列名称的变量

CREATE FUNCTION [dbo].[GetValue] 
(
@ID varchar(36), 
@PreprtyName varchar(150) 
) 
RETURNS varchar(250) 
AS 
BEGIN 

DECLARE @RetVal varchar(MAX) 
DECLARE @SQL varchar(MAX) 
SET @RetVal ='' 

SET @SQL = 'SET @RetVal = (Select '+ @PreprtyName + ' FROM TableMedia WHERE ID = '''+ @ID +')''' 
exec @SQL 

SET @RetVal = @RetVal 

RETURN @RetVal 
END 

得到错误找不到“找不到存储过程”

这里是我试图避免的。

SELECT  pr.ProductID, tManufacturerImage.Image, tMediaCenter.ManualFileName,tMediaCenter.BrochureFileName, tMediaCenter.AssemblyFileName 
FROM   tMediaCenter RIGHT OUTER JOIN 
         tProduct AS pr INNER JOIN 
         tmp_dmi AS dmi ON REPLACE(REPLACE(pr.SKU, 'ACS', ''), 'DMI', '') = RTRIM(LTRIM(dmi.pri_SKU)) ON tMediaCenter.ProductID = pr.ProductID LEFT OUTER JOIN 
         tManufacturer INNER JOIN 
         tManufacturerImage ON tManufacturer.ManufacturerID =  tManufacturerImage.ManufacturerID ON pr.ManufacturerID = tManufacturer.ManufacturerID 
WHERE  (pr.ManufacturerID = 'f35fc01680-4938-4070-a367-38c31efb01f') AND (dmi.MAP IS  NULL) AND (pr.ParentID <> '') 

这对我不起作用。

+0

你用来调用这个函数的代码是什么? – Taryn

+0

从表 – monsey11

+1

中选择dbo.GetValue(pr.ID,'Manual')可能的重复[在SQLServer 2005函数中执行动态SQL](http://stackoverflow.com/questions/150552/executing-dynamic-sql-in -a -sqlserver-2005-function) – Taryn

回答

2

你不能。用户定义的函数不支持动态SQL。您需要使用存储过程来完成此操作,或者更好地定义最终目标,而不是告诉我们您需要使用动态SQL在函数中解决它。

CREATE PROCEDURE [dbo].[GetValues] 
    @PreprtyName VARCHAR(150) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = N'SELECT ' + @PreprtyName + ' FROM dbo.Table;'; 

    EXEC sp_executesql @sql; 
END 
GO 

在查询中,您不会轻松地以内联方式执行此操作,对不起。问题在于无法从函数执行此操作,并且没有办法在单个查询中为每行调用存储过程。你可以构建一个循环和其他所有东西,但是我认为上述过程可以满足你的需求,而不需要额外的工作和开销。

如果您需要将其限制为某一组ID值,则需要描述您现在如何尝试这样做。

+0

我需要在内嵌查询中使用它。 – monsey11

+0

@ monsey11事实上,你“需要”并不可能,对不起。如果你更准确地解释你想要做什么,也许有解决方法。 –

+0

现在我正在使用基于表中列的“Case”。如果添加了一列,我将需要修改该功能。这正是我想要避免的。 – monsey11