0

列のリストに基づいて、SQLサーバーに動的一時テーブルを作成する必要があります。たとえば、実際のテーブルを参照する列の名前が多数あるテーブルListOfColumnsがあります。

ListOfColumns
ColumnNameA
ColumnNameB
ColumnNameC

これらすべての列を含む文字列をこの形式で取得する関数を作成します。

"ColumnNameA, ColumnNameB, ColumnNameC"

ここで、Report という実際のテーブルにある列に基づいて、一時テーブルを作成する必要があります。列を増減できます (動的レポート列ジェネレーターです)

動的 SQL を実行する必要があります。各列のデータ型がありません。動的 SQL を使用して一時テーブルを作成し、Report テーブルのデータ型を継承したいと考えています。これを行う方法はありますか?

ところで...グローバル変数は使いたくない。ありがとうございました。

4

2 に答える 2

0

たとえば、レポートテーブルが次のようになっている場合:

create table Report (
  ColumnNameA varchar(4),
  ColumnNameB integer,
  ColumnNameC integer,
  ColumnNameD varchar(8),
  ColumnNameE bit,
  ColumnNameF integer
 );

次の手順を作成できます。

create proc copy_table @col_names varchar(128)
as
DECLARE @SQLQuery AS NVARCHAR(500)
SET @SQLQuery = 'SELECT ' + @col_names + ' into ReportTemp from Report where 1 = 0'
EXEC(@SQLQuery);

以下のように、コンマ区切りの列文字列を使用して呼び出します。

exec copy_table @col_names = 'ColumnNameA, ColumnNameB, ColumnNameC'

そして、正しい列タイプでテーブルを作成する必要があります。テストするには、1つの行を挿入してから、クエリを実行します。

insert into ReportTemp values ('abc', 1, 2 );
select * from ReportTemp;

これが実際に動作していることを確認するには、このSQLフィドルを確認してください。

これは制約やインデックスなどを引き継ぐのではなく、列名とタイプだけを引き継ぐことに注意してください。

于 2012-12-01T05:27:47.783 に答える
0

動的一時テーブルを作成することはできません。

これは、一時テーブルが SQL セッションに関連付けられているためです。動的 SQL を実行すると、セッションの最後に終了する新しいセッションが作成されます。そのため、テーブルはexec. 次に、制御が呼び出し元のプロシージャに戻ると、ドロップされます (またはコンテキストから外れます)。

以下にいくつかの回避策を示しますが、どれも気に入らない場合があります。

  1. 作業テーブルを表す "_" などの正規のプレフィックスを使用してテーブルを作成します。次に、このテーブルをストアド プロシージャにドロップし、ほとんどの場合、例外をキャッチしてドロップします。
  2. 考えられるすべての列値を含む一時テーブルを作成します。
  3. このような作業テーブル用に独自の「一時」データベースを作成します。
  4. 一般的な列名を使用し、これらの一般的な列から別の場所の列への対応を維持します。
于 2012-12-01T18:31:44.130 に答える