6

属性を取り、ピボット関数を使用して関連する SQL ステートメントを生成するテーブル値関数を MSSQL に含めることはまったく可能ですか?

CREATE FUNCTION dbo.fnPivot (@EntityTypeID int)
RETURNS TABLE
AS
BEGIN
    DECLARE @SQL varchar(MAX);
    DECLARE @COLS varchar(MAX);

    select @COLS=coalesce(@COLS+',','')+'['+Name+']'from c_EntityAttribute WHERE EntityTypeID = @EntityTypeID;

    SET @SQL = 'SELECT * FROM (SELECT EntityInstanceID, AttributeName, Value FROM v_EntityElementData WHERE EntityTypeID = 1) as s';
    SET @SQL = @SQL + 'PIVOT ( MIN(Value) FOR AttributeName IN (' + @COLS + ') ) AS p';

    RETURN EXEC sp_ExecuteSQL @SQL ;
END
4

4 に答える 4

6

残念ながら、ストアド プロシージャを除いて、SQL Server はすべてのビュー、関数などの出力のテーブル定義を追跡します。したがって、入力で列と型を動的に変更することはできません。

このため、PIVOT 演算子が役立つとは思いませんでした。一般に、さまざまな列データを取得する唯一の方法は、それを XML として扱うことです。

どういう理由で振り向くの?これは通常 UI の問題であるため、UI や SSRS などで行うことをお勧めします。

于 2009-06-22T11:27:02.037 に答える
3

テーブル値関数は常に指定されたスキーマを返す必要があるため、これは不可能です。

于 2009-06-22T11:27:20.270 に答える
1

これは、この種の機能に対応するために私が行ったことです (ビューとしてですが、関数は同じ方法論に従います)。すべてのインストール スクリプトの最後に貼り付けたので、ピボットされているテーブルに変更が加えられると、それらは再生成されたビューで取得されます。

IF EXISTS (SELECT *
       FROM   sys.objects
       WHERE  object_id = Object_id(N'[dbo].[vwYourView]')
              AND type IN ( N'V' ))
BEGIN
  DROP VIEW [dbo].[vwYourView]
END
GO                            

Declare @cols VARCHAR(MAX)

Select @cols = COALESCE(@cols + ',[' + YourColumn+ ']',
                                 '[' + YourColumn+ ']')
                                 FROM YourTable
                                 Order By YourColumn

DECLARE @query VARCHAR(MAX)
Set @query =
N'
Create View vwYourView
AS
Select * FROM YourTable
Pivot (
    MAX(YourVal)
    FOR YourColumn IN( '+
        @cols
    +')
) AS pvt
'

Execute(@query)

Select * FROM [vwYourView]
于 2011-12-16T16:05:20.207 に答える