2017-01-14 12 views
2

はどのような構造のコースとSQL ServerのT-SQLで、別のテーブルに格納されたテーブルを作成するストアドプロシージャを作成することができますか?T-SQL構造が別のテーブルにあるテーブルを作成する方法は?

+0

を? information_schema.columnsのような構造か、テーブル構造を複製したいですか?構造体を複製するには 'select top 0 * from newtable into ... 'を使います。 – Deadsheep39

+0

yeah columns、新しいテーブルを埋めるために使用される列! – Ayoubleb

答えて

3

T-SQLはSELECT * ... INTO構文を使用してその場でテーブルを作成することができます:

SELECT * INTO TargetTable 
FROM SourceTable 
-- any false returning condition will do 
WHERE 1 = 0 

これもエレガント(Deadsheep39のおかげで)書き込むことができます:

SELECT TOP 0 * INTO TargetTable 
FROM SourceTable 

しかし、これは次の場合に失敗しますTargetTableは既に存在するため、その存在を確認する必要があります。

IF OBJECT_ID('TheSchema.TargetTable') IS NOT NULL 
    DROP TABLE TargetTable 

また、索引、制約、トリガーも作成されません。詳細についてはhereをご確認ください。

あなたは(テーブル名がパラメータです)ダイナミックに行きたい場合は、動的なクエリを作成して実行することができます別のテーブルに格納されて何

CREATE PROCEDURE dbo.GenerateTable 
(
    @SourceTable VARCHAR(128), 
    @TargetTable VARCHAR(128) 
)  
AS 
BEGIN 
    DECLARE @SQL NVARCHAR(4000) = N' 
     SELECT * INTO ' + QUOTENAME(@TargetTable) + ' 
     FROM ' + QUOTENAME(@SourceTable) + ' 
     -- any false returning condition will do 
     WHERE 1 = 0' 
    EXEC (@SQL) 
END 
GO 
+0

チェック - '(「dbname.schema.tablename」)OBJECT_ID場合はnullをドロップテーブルdbname.schema.tablename'ないか、またはあなただけのデフォルトのスキーマを使用して、DB上にある場合'object_id( 'tablename')がnullでない場合、 'drop table tablename'またはtempdb'の例です(' tempdb ..#tablename ')はnullではないdrop table tempdb ..#tablename'。 – Deadsheep39

+0

@ Deadsheep39 - あなたの提案通りにオブジェクトの存在チェックを簡略化しました。ありがとう。 – Alexei

2

あなたはCREATE TABLE文で文字列としてクエリを作成し、sp_executesqlストアドプロシージャを使用してそれを実行することができます。このように例えば

@query変数にあなたが必要なテーブルの種類に基づいて構築することができます
DECLARE @query nvarchar(max) = N'CREATE TABLE Table(Col nvarchar(50) NULL)' 
EXECUTE sp_executesql @query 

+0

基本的には、手動で定義しなければならない入力を使って、必要以上に難しい方法でcreate table文を実行できますか? OPへの良い答えではない、-1。 – Tobb

+0

私の知る限りでは、テーブルを動的に作成する方法は、その構造が別のテーブルに格納されているということが分かりました。 –

+0

はい、SELECT INTOを使用できますが、どのような新しいテーブル構造が指定されていないのかという疑問があります。以降のみのコメント「ええ列、新しいテーブルを埋めるために使用されようとしているcolums」 –

関連する問題