質問

SQL Server 2008の私は、動的に生成されたテーブルを返すために必要な状況がある、と列も動的に生成されます。

私は1つのIDを始めとして、

この中にすべてが、なぜ鋳物である、そして私は、列名とタイプを取得し、クエリによって生成された。

続き1つの状況では、私が欲しいテーブルを返します最終クエリ、であるが、これと同様のクエリが複数のテーブルを返すために使用することができます。

私は、テーブルを返すために、いくつかのクエリは、このクエリを構築することができますか確かではないよ、これは現在、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によって行われたボートの上に別のクエリを行うことができ、クエリは、車がいたよりも、ボート上の表の列が異なっていても同じように機能する必要があります。

役に立ちましたか?

解決

あなたは、動的SQLでこれを行うことができます。あなたは、クエリおよび/またはメタデータを適切にあなたの二つのリストを構築し、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にすることはできませんので、

私は、メンテナンスを容易にするためにそのようなことを行っています。列が解釈されていないクライアント側のレポートスタイルまたはリストボックスを使用するためには、それは問題ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top