2009-05-13 17 views
0

SQL Server 2008動的に生成されたテーブルを返す必要がある状況があり、列も動的に生成されます。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製のボートについて別の質問をすることもできます。ボートのテーブルの列が車のものと異なっていても、クエリは同じになります。

+0

私は、動的に生成されたテーブルを返す必要があると思います。なぜこれが必要なのか、いくつかの背景を説明できますか? – RedFilter

+0

データベースのすべてのテーブルを一覧表示するテーブルがあります。だから、私はエンティティ名から始めます。私はそれを使ってテーブル内のカラム名をプライマリ・キーとともに取得します。次に、この段階で、そのエンティティの各列のすべての値を取得したいので、列名が動的に生成されます。 –

答えて

0

これは動的SQLで行うことができます。 @SELECT_COLUMN_LIST@PIVOT_COLUMN_LISTを移入するに

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) 

、あなたはいくつかのオプションを持っているが、このようなものはどれかを避ける:あなたは、クエリおよび/またはメタデータを適切にあなたの二つのリストを構築し、SQLにそれらを挿入する必要がありますカーソルまたは厄介な文字列操作のために必要:

@SELECT_COLUMN_LISTのため明らかに
SELECT @PIVOT_COLUMN_LIST = COALESCE(@PIVOT_COLUMN_LIST, '') + ',' + QUOTENAME(value) 
FROM (SELECT DISTINCT value FROM table) 

あなたには、いくつかのメタデータで、この情報を結合する必要があります。

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

+0

ありがとうございます。このような動的データベースの使い方を理解することには苦労しています。 :) –

+0

一般に、データベース内にデータベースを構築しようとするのは悪い考えですが、動的SQLにはその場所があります。 –