0

SQLプロシージャ内で、一時テーブルを作成してからピボットします。これは動的であるため、最終的には列がいくつあるかわかりません。このテーブルを作成しましょう:

equipmentID   |   Name1   |   Name2   | Name3
1             |   34.54   |   21.23   | 213.65
2             |   334     |   23.421  | 23.12
3             |   43.4    |   2.34    | 23.41

これを生成するために使用されるクエリは文字列に格納され、を呼び出すことによって実行されexecute(@stringQuery)ます。

私の他のテーブルは通常のSQLクエリでフェッチされ、別の情報セット(equipmentIDピボットテーブルに含まれているものを含む)を生成します。

私がやりたいのは、これら2つのテーブルを結合することです(equipmentIDストアドプロシージャが2つではなく1つのテーブルを返すように基づいていますが、これを行う方法がわかりません。

これまで私はいくつかのことを試みました:

  • メイン(2番目)のクエリを保持し、セクションの最後に実行行を追加して、FROMすべてのテーブルが結合された後、次のようにします。

    LEFT JOIN execute(@stringQuery) as strQ on strQ.equipmentID = mainQ.equipmentID

  • 2番目のクエリを文字列にして、両方がexecuteコマンドでフェッチされるようにするか、メインSQLを含む別のストアドプロシージャを作成して、(再び)両方がexecuteコマンドを使用するようにしました。これは、情報を組み合わせないだけで情報を取得します。この場合、これら2つの実行を次のように組み合わせようとしました。

    execute('select * from (' + @query1 + ') as tbl2 left join ' + @query2 + ' as tbl1 on tbl2.equipmentID= tbl1.equipmentID')

  • メインクエリを文字列に変換してから、を使用してそれらを結合すると、 LEFT JOIN1つの大きなクエリになります。

これらすべてが私に問題を与えました。私はこれが一般的なことであると考え、私がすでに試したこと以外にそれを解決するためにどのようにアプローチするかがわかりませんでした。

編集 一時テーブルを作成して挿入(または選択)しようとすると、一時テーブル名が無効なオブジェクトであると通知されます。

4

3 に答える 3

1

動的クエリを一時テーブルに出力するのはどうですか。次に、他のテーブルと同じように出力を参照できます。

動的クエリ:

SELECT x,y,z 
INTO #MyTempTable
...

最終クエリ:

SELECT *
FROM TABLE
    JOIN #MyTempTable ON ...
于 2012-04-12T18:27:11.617 に答える
1

あなたの質問は見た目より少し難しいです。問題は、形式が不明なテーブル(動的に生成された列)があるという事実に起因します。

実行時にのみ認識される列を持つテーブルは、複雑で面倒なソリューション、または理想的ではないソリューションを強制します。

選択したグローバル一時テーブルソリューションは、最も単純なソリューションの1つですが、ここで、選択したソリューションのいくつかの落とし穴を確認してください(「グローバル一時テーブル」までスキップするか、「##」を検索してください)。 www.sommarskog.se/share_data.html

簡単な答えは、それを行う良い方法はないということです。

于 2012-04-19T13:19:44.087 に答える
0

私はこれを機能させました。私がしたことは、グローバル一時テーブルを使用することでした。executeそうすれば、通常の一時テーブルを使用するのではなく、複数のステートメントで使用できます。このようにして、グローバル一時テーブルに参加することもできました。プロシージャごとに一意のIDを使用することを忘れないでください。これにより、現在作業している行を確認できます。これは、いくつかのプロシージャで確認できます。このようにして、最後に(IDに基づいて)行を削除することもできます。

于 2012-04-16T15:56:05.527 に答える