2012-01-20 11 views
6

私のデータベースにはすでに複数のテーブルがあります。いくつかの列にはかなりの数の列があります。既存のテーブルと一致するユーザー定義のテーブルタイプを自動的に生成

これらのテーブルを使用してマージステートメントを実行するストアドプロシージャをいくつか作成します。これを行うには、ストアドプロシージャのパラメータをUser Defined Table型にしたいと思います。

私は各テーブルからスクリプトを出し、それをユーザー定義のテーブルタイプ作成ステートメントに変更できます。

私が本当に好きなのは、自分のデータベースの既存のテーブルからユーザー定義のテーブルタイプを生成する方法です。それから、そのスクリプトを自分のデータベースビルドに追加することができました。そして、テーブルに新しい列を追加することは複数の編集を必要としません。

これを行う方法はありますか?それとも、テーブルをスクリプト化するだけで忙しいのですか?

+0

システムストアドプロシージャがあります。 'sp_columns'を実行すると、すべてのメタデータを取り出すことができます。あなたはそれをマッサージし、動的SQLを使用してクローンテーブルを作成することができます。私はあなたが 'SELECT * INTO NewTable FROM OldTable WHERE 42 = 13'を使って既存のテーブルと同じ構造を持つ新しい空のテーブルを作成することを考えていると仮定していますが、行はありません。 – HABO

+1

@ user92546 - 'table'と' user defined table type 'は同じものではありません。 – MatBailie

答えて

3

SQL Server Management Studioでは、データベースを右クリックし、[タスク]の下でデータベースのスクリプトを選択できます。テーブルだけを選択してから興味のあるテーブルを選択してください。

あなたが望むものにワンストップショップを与えるわけではありませんが、多くのテーブルをすばやく簡単にスクリプトできます。そして、あなたが必要とするものを得るために、あなたは少しの発見と置き換えを行うことができます。

1

私はこれを試してみましたやりなさい、私はそれは一時テーブル上で動作します知っている:

SELECT * 
INTO NewTable 
FROM OldTable 
WHERE FALSE 

は、しかし、それをコピーするすべてはあなたが必要とするように注意してください、それは任意のキー、インデックスまたは権限を越えもたらすことはありません。

EDITED:先端user92546

+1

行を移動しない場合は、 'TRUNCATE'する必要はありません。真偽を決して出さない 'WHERE'節を追加するだけです。 'WHERE '議会='進歩 '。 – HABO

+1

質問をよくお読みください。 OPは、表の後ではなく、表定義*スクリプト*の後にあります。具体的には、スクリプトは* UDTタイプ*定義スクリプトになるはずですが、いずれにせよ*スクリプト*でなければなりません。 –

+0

@Andriy - あなたは正確です。答えのほとんどは、テーブルをスクリプト化する方法を示しています... – Vaccano

1

ため おかげで私は自分の答えに話している1人の民主党員のようなデータベースのスクリプトを生成するためのウィザードがあった知りませんでした。ウィザードは、さまざまな種類のオブジェクトのスクリプトを一度に生成できるため、私が使用している方法よりも普遍的な方法です。

でも、テーブルだけのような同じタイプのオブジェクトをスクリプト化する必要があるときは、少しシンプルで使いやすいと思うので、私は共有します。

だから、ここ(特にテーブルのために)行く:

  1. オープンは、エクスプローラ(F8)をオブジェクトとターゲット・サーバーのインスタンスに接続します。

  2. データベースアイテム。

  3. データベース名で項目を展開します。

  4. をクリックします。

  5. オープンオブジェクトエクスプローラの詳細(F7)。これで、ユーザーテーブルのリストが表示されるはずです。

  6. 複数のオブジェクト(Ctrl +クリックなど)を選択する標準的なWindowsの方法を使用して、スクリプトを作成するテーブルを選択します。

  7. スクリプトテーブル▸を選択し、スクリプトの種類と保存場所を選択します。

は、あなたの代わりにテーブル、例えばの異なるオブジェクトエクスプローラの「フォルダ」に進み、スクリプトオブジェクトの種類をする必要がある場合ストアドプロシージャの場合は、プログラマビリティ\ストアドプロシージャになります。

1

私は時々同じものが必要です。ここに私がまとめた小さなスクリプトがあります。それは少しラフだと私は私の人生でそれを信用しないだろうが、それは私の場合は合理的にうまく動作します。それはキーのスクリプトではありませんが、私のシナリオでは必要ではありません。私はSQL 2012を使っているので、SQL 2008と同じように動作するかどうかは完全にはわかりません。geometry,geographyなどのような、よりエキゾチックなタイプのものについてはテストしませんでした。それらを使用してください。

declare 
    @tablename nvarchar(50)='Users', 
    @schemaname nvarchar(50)='dbo', 
    @sql nvarchar(max)=N''; 

select @sql += N',' + NCHAR(13) + NCHAR(10) + NCHAR(9) + N'[' + c.COLUMN_NAME + N'] [' + DATA_TYPE + N']' 
    + case when c.CHARACTER_MAXIMUM_LENGTH is not null then N'(' + case c.CHARACTER_MAXIMUM_LENGTH when -1 then 'max' else cast(c.CHARACTER_MAXIMUM_LENGTH as nvarchar(10)) end + N')' else N'' end 
    + case when c.DATA_TYPE = N'numeric' then N'('+CAST(NUMERIC_PRECISION as nvarchar(10))+N', '+CAST(NUMERIC_SCALE as nvarchar(10))+N')' else N'' end 
    + case when c.is_nullable <> N'NO' then N' NULL' else N' NOT NULL'end 
from INFORMATION_SCHEMA.COLUMNS c 
where TABLE_NAME = @tablename AND TABLE_SCHEMA = @schemaname 
order by ORDINAL_POSITION; 

set @sql = stuff(@sql, 1, 1, N'CREATE TYPE [' + @schemaname + N'].[tab_' + @tablename + N'] AS TABLE(') 
    + nchar(13) + nchar(10) + ')' + nchar(13) + nchar(10) + 'GO'; 
set @sql += nchar(13) + nchar(10) + '--GRANT EXEC ON TYPE::[' + @schemaname + N'].[tab_' + @tablename + N'] TO [User];' 
    + nchar(13) + nchar(10) + '--GO'; 

print @sql 
-- If you're happy with the sql, you can pass it to sp_executesql to create your type 
-- exec sp_executesql @sql; 
関連する問題