2009-04-20 12 views
28

SQL Serverの特定の順序でテーブルに列を追加することはできますか?新しいテーブル列を特定の順序位置に追加

たとえば、各テーブル定義の「最後」に、CreatedOn、CreatedBy、LastModifiedOn、LastModifiedByの各列があります。新しい列がSSMSのこれらの列の上に表示されるようにしたいと思います。

データベースの変更がすべてスクリプト化されている場合、この順序をテーブルの最後に保存する方法はありますか?

参考までに、これを行う必要がある場合でも、私は火炎戦争を始めるつもりはありません。あなたはすぐにそれに退化スレッドについて読みたい場合は、ここでは良いものだ:

http://www.developersdex.com/sql/message.asp?p=581&r=5014513

+0

これが、すべてのテーブルの上にビューを作成する必要がある理由ですか? –

+0

関連:http://stackoverflow.com/q/1605144/12484 –

答えて

23

あなたが元のテーブルのスキーマを反映していますがたい列の順序で一時テーブルを作成する必要があり、元の内容を一時的にコピーします。元のファイルを削除し、一時ファイルの名前を変更します。

これは、SQL Management Studioが舞台裏で行うことです。

スキーマ同期ツールを使用すると、これらのスクリプトを自動的に生成できます。

+0

Tempテーブルは、「tempdb」の外で名前を変更することはできません。 –

3

SQL Server Management Studioに入り、既存のテーブルを「設計」します。途中に列を挿入し、作成したスクリプトを見ます。基本的には、適切な列の順序で一時表を作成し、元の表からデータを挿入し、元の表を削除して、一時表の名前を変更します。これはおそらくあなたがする必要があるでしょう。

3

私の知る限り、列の順序を変更する方法は知られていません。背後には、SQL Management StudioがJose Basilioの言ったことがあります。そして、大きなテーブルを持っている場合は、このように列の順序を変更することは実用的ではありません。

「ビュー」を使用できます。 SQLビューでは、テーブルの列の変更による影響を受けることなく、好きな順序で使用できます。

0

テーブル構造内の特定の順序で列を作成することはできません。プラス、なぜあなたにしたいですか? SQL Serverの列の順序は完全に無関係です。

SQL Server Management Studioには、列の任意の場所に列を作成できるように見えるデザインビューがありますが、ここで実際には新しい列の新しい表が作成され、古いものは落ちる。

特定の場所に列を作成する列や「並べ替え」列を作成するSQL DDLコマンドはありません。それは本当に必要ではありません。

マルク・

+4

なぜあなたはしたいですか?だから、SSMSのものを見るのは簡単です。たとえば、ある製品が工場を経て進行するタイムスタンプのセットで構成されているテーブルを持っている場合、それらを自然にデータベースに順番に並べると、前後に多くジャンプするのではなく、データを読みやすくなります。はい、コードには関係ありませんが、デバッグしようとすると認知負荷を軽減するのに役立ちます。 –

+0

@コリンマッカイ:そうです、それは何のためのものです。デバッグ後に削除することを忘れないでください。 –

7

答えはイエス、それは技術的には可能ですが、あなたはそうする頭痛を持っていますし、それが実行され、セットアップに時間がかかりますです。

ワン:ここでのスクリプトの例は、[保存]をクリックすると、それが発生して実行されます:作成/コピー/ドロップ/

これは、SQL Serverのグラフィカル・インタフェースにやっていること実際にある名前を変更しますテーブルの先頭に新しい列を追加した後にボタンをクリックします。

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/ 
BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_SomeTable 
    (
    MyNewColumn int NOT NULL, 
    OriginalIntColumn int NULL, 
    OriginalVarcharColumn varchar(100) NULL 
    ) ON [PRIMARY] 
    TEXTIMAGE_ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON 
GO 
IF EXISTS(SELECT * FROM dbo.SomeTable) 
    EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF 
GO 
DROP TABLE dbo.SomeTable 
GO 
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO 

GO 
COMMIT 

2:COLUMN/UPDATE/DROP列を追加/ RENAME

この方法基本的に、あなたは新しい列の「正しい」に追加する任意の既存の列のコピーを作成する必要が新しい列にデータを転送した後、元のデータを削除して新しいデータの名前を変更します。これは、あなたがそれらをrepointする必要があるので、あなたが持っている任意のインデックスまたは制約で大混乱を演奏します。技術的には可能ですが、開発と実行の両方で時間がかかります。

CREATE TABLE MyTest (a int, b int, d int, e int) 

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5) 

SELECT * FROM MyTest -- your current table 

ALTER TABLE MyTest ADD c int -- add a new column 
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move 
ALTER TABLE MyTest ADD e_new int 

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns 

ALTER TABLE MyTest DROP COLUMN d -- remove the originals 
ALTER TABLE MyTest DROP COLUMN e 

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns 
EXEC SP_RENAME 'MyTest.e_new', 'e'; 

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample 

3:それ

これは激しくための私の感覚を傷つけると同居...しかし、時には、それだけの価値が入れ替えではありません。

0

TFS 2013は自動的にを行います。

テーブルに新しい列を追加して、それをTFSにコミットします。そこから、Visual Studioでテーブルのsqlファイルを開き、T-SQL CREATEスクリプトの列の順序を手動で移動できます。次に、Tools> SQL Server> New Schema ComparisonにあるVSのスキーマ比較ツールを使用して、ターゲットデータベースを更新できます。変更をソースとして、データベースをターゲットとして更新するデータベースプロジェクトを選択します。テーブルのスクリプトを比較して選択し、更新します。 VSは自動的に削除され、追加されます。すべてのデータは安全でインデックスに登録されます。

0

汚いとシンプル。
テーブルをcsvにエクスポートします。
新しいデータを目的の位置に挿入します。
ドロップテーブル。
目的の列の仕様で新しい表を作成します。
csvから新しいテーブルにカラムをロードします。

関連する問題