如何在标量值函数中使用变量作为列名?
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 :(得分: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值,则需要说明您现在的尝试方式。