0

SQL Server 2008 では、動的に生成されたテーブルを返す必要があり、列も動的に生成されます。

1 つの ID から始めて、列の名前と型を取得したため、これがすべてクエリによって生成されました。これがキャストの理由です。

以下は、ある状況で必要なテーブルを返す最終的なクエリですが、この同様のクエリを使用して複数のテーブルを返すことができます。

これは現在 C# で実装されていますが、ストアド プロシージャまたは関数で実行できるはずですが、このクエリを作成してテーブルを返すために複数のクエリを作成する方法がわかりません。

ありがとうございました。

SELECT ResultID, ResultName, ResultDescription, 
CAST([233] AS Real) as [ResultColA], 
CAST([234] AS Int) as [ResultColB], 
CAST([236] AS NVarChar) as [ResultColC], 
CAST([237] AS Int) as [ResultColD]
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ([233], [234], [236], [237])) as pvt

更新: 車のメーカーを含むテーブルがあり、GM 製の車のすべての属性が必要な場合。車の情報を検索し、それを使用してすべての自動車メーカー (GM) を取得します。次に、GM によって製造されたすべての車の情報を取得したいのですが、情報が動的に生成されているため、列異なっています。それが私がいる場所で、このテーブルを動的に生成する必要があります。Web サービスを呼び出すだけで、動的に生成されたクエリを取得し、ストアド プロシージャまたは関数でそのクエリを実行できるかどうかに興味があります。

更新 2: この表を取得した後の次のステップは、車の実際の価格を決定するために、車のすべてのオプション (この場合) を合計する必要があることです。そのため、表形式にする必要があります。この時点で、GM 製の車を見ていますが、SeaRay 製のボートに対して別のクエリを実行することもできます。クエリは、ボートのテーブル列が車とは異なっていても同じように機能するはずです。

4

1 に答える 1

0

これは、動的 SQL で行うことができます。クエリやメタデータを使用して 2 つのリストを適切に作成し、それらを SQL に挿入する必要があります。

DECLARE @template AS varchar(MAX)

SET @template = '
SELECT ResultID, ResultName, ResultDescription
{@SELECT_COLUMN_LIST}
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ({@PIVOT_COLUMN_LIST})) as pvt'

DECLARE @sql AS varchar(MAX)

SET @sql = REPLACE(REPLACE(@template, '{@SELECT_COLUMN_LIST}', @SELECT_COLUMN_LIST), '{@PIVOT_COLUMN_LIST}', @PIVOT_COLUMN_LIST)

EXEC (@sql)

とにデータを入力するには@SELECT_COLUMN_LIST@PIVOT_COLUMN_LISTいくつかのオプションがありますが、次のような方法でカーソルや面倒な文字列操作を行う必要がなくなります。

SELECT @PIVOT_COLUMN_LIST = COALESCE(@PIVOT_COLUMN_LIST, '') + ',' + QUOTENAME(value)
FROM (SELECT DISTINCT value FROM table)

明らかに@SELECT_COLUMN_LIST、この情報をいくつかのメタデータと組み合わせる必要があります。

PIVOT と UNPIVOT ではリストを動的 SQL にすることができないため (出力テーブルのスキーマが変更されるため)、メンテナンスを容易にするためにそのようなことを行いました。列が解釈されないクライアント側のレポート スタイルまたはリストボックスの使用については、問題ではありません。

于 2009-05-15T16:19:58.817 に答える