2011-02-04 6 views
6

私はいくつかの連続するSELECTステートメントを実行するストアドプロシージャを作成しています。 ADO.NETを使用してこの手順を実行すると、DataTable個のオブジェクトを含むDataSetになります。これは、期待どおりに動作します。SQL Serverの結果セット内のテーブルに名前を割り当てる

DataSetのテーブルの順序に依存していますが、ストアドプロシージャのSELECTステートメントの順序と一致するようになっていますが、実際にはこの順序では意味がありません。最終的に手順を維持しなければならない人は、結果の期待される順序を知る必要はなく、また、アプリケーションを維持する人が手順の中のステートメントの順序を知る必要があります。

私が知りたいのは、ストアドプロシージャそのものの中の各SELECTステートメントの結果に名前を付けることができますか?そして、これらがADO.NETを介して(うまくいけばシームレスに)注文の代わりにテーブルの名前で?

// populate DataSet with results from stored proc 
DataSet ds = new DataSet(); 
dataAdapter.Fill(ds); 

// now access one of the resulting DataTable via name 
return ds.Tables["NamedResultFromTheProc"]; 

これを達成する方法はありますか?または、私はSELECTステートメントの順序に頼る必要があり、常にそのインデックスで目的のテーブルにアクセスする必要がありますか?

答えて

5

私はこれを試していませんでしたが、あなたが持っているように、あなたがストアドプロシージャの構造を変更することができませんでした各データクエリの前にテーブルの名前を返すクエリ?

すなわち

select 'TableName' 
select * from Table where 1 = 1 

次いで、テーブルを作成し、それらを追加することによって、手動でデータセットを構築しますか?

+0

それは問題を解決するだろうが、それはその慣習に従う手続きを維持している人にまだオニスを置きます。 T-SQLで直接サポートされているより緊密なソリューションを望んでいましたが、そのような機能は存在しないようです。 –

2

残念ながら、私はこれが可能だとは思わない!私はストアドプロシージャからDataSetsを取得する同様のセットアップを持って、見た後私はあきらめてインデックスに頼った。

1

結果セットは照会されたテーブルの名前を持ちません(内部結合を使用すると認識可能な可能性もありません)ので、そのSQL "fault"はDataAdapter/Setの障害ではありません。テーブルアダプタには、名前を選択するためのクエリがあります。 最初に、プロシージャ内のクエリ#0としてテーブルのリストを返すことができます。

select 'MyTable;MySecondTable;ThirdOrSo' as tables 

この後に他のすべてのクエリを指定すると、インデックス0のテーブルとこのフィールドsplit/forloopが読み込まれ、データセット内の他のテーブルの名前が変更されます。メンテナはまだメカニズムを知っている必要がありますが、少なくとも再構成の自由を与えます。

+0

ありがとう;あなたの提案はある程度は助けになりますが、それは理想的ではありません。少なくとも、これはクライアントアプリケーションではなく、データベースとの間違いを確実に処理する責任を負います。 –

3

クエリから返されるテーブルには、 "テーブル"、 "テーブル1"、 "テーブル2"などの名前が与えられます。

あなたのテーブル名にマッピングするためにあなたのDataSetを充填する前に、あなたのDataAdapterにTableMappingsを追加することができます。

myAdapter.TableMappings.Add("Table", "MyTable1"); 
myAdapter.TableMappings.Add("Table1", "MyTable2"); 
myAdapter.TableMappings.Add("Table2", "MyTable3"); 
+2

これは、ポストの初期の問題を解決しません、プロシージャのメンテナの能力は、クエリの順序について心配することはありません。 – mmix

+0

彼は彼が求めていることを正確には与えません。彼は結果セットを特定の順序で返すようにSPをコードする必要があります(私の見解では妥当な制限です)。しかしその後、結果のDataSetのテーブルにインデックスではなく名前でアクセスし、結果がDataSetを満たすDALクラスに返される順序についての知識を制限します。 – Joe

0

私はこれについても考えていました。私が考えることができる唯一の解決策は、プロシージャ内に一時テーブルを作成し、そこに結果を移入することです。

私はこれを試したことがありません。なぜなら、結果を2回取得すること(テンポラリテーブルへのクエリ、テンポラリテーブルのクエリ)を行う正しい方法がないからです。

あなたは自分の結果は、あなたが「列として[カスタム列]」を名前を変更することができます同じようにSQLに設定し名前を変更することができればそれは本当に有用であろう...

2

これはまた、最適なソリューションではありませんが、あなたのクエリの最初の列をテーブル名にすることができます:

Select 'Customer', CustomerID, CustomerName, CustomerAddress 
    From Customer 
    Where CustomerID = @CustomerID 

    Select 'Orders', OrderID, OrderPrice, OrderDate 
    From Order O 
    Join Customer C on C.CustomerID = O.CustomerID 
    Where C.CustomerID = @CustomerID 

    Select 'OrderItems', ItemID, ItemDescription, ItemPrice 
    From OrderItems I 
    Join Order O on O.OrderID = I.OrderID 
    Join Customer C on C.CustomerID = O.CustomerID 
    Where C.CustomerID = @CustomerID 
関連する問題