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 <> '')

これは私にはうまくいきません。

4

1 に答える 1

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 値のセットに制限する必要がある場合は、それをどのようにしようとしているのかを説明する必要があります。

于 2012-05-16T21:16:41.117 に答える