SQL Server 2005でSQLクエリを使用してテーブルの列の順序を変更する方法
SQLクエリを使用して、テーブル内の列の順序を並べ替えたい。
できません。列の順序は、私たち人間が気にする「化粧品」のようなものです-SQL Serverにとって、それはほとんど常に絶対に無関係です。
列の順序を変更するときにバックグラウンドでSQL Server Management Studioが行うことは、新しいCREATE TABLE
コマンドを使用してテーブルを最初から再作成し、古いテーブルからデータをコピーしてからドロップすることです。
列の順序を定義するSQLコマンドはありません。
「デフォルト」の順序に*を使用する代わりに、返される順序でフィールドを明示的にリストする必要があります。
元のクエリ:
select * from foobar
返却値
foo bar
--- ---
1 2
書いて
select bar, foo from foobar
bar foo
--- ---
2 1
http://msdn.Microsoft.com/en-us/library/aa337556.aspx
このタスクは、Transact-SQLステートメントを使用して実行できません。
create
/copy/drop
/renameを使用すると、 komma8.komma1
または、SQL Server Management Studioを使用できます
- Object Explorerで、並べ替える列があるテーブルを右クリックし、Design(ver。2005 SP1以前で変更)
- 並べ替える列名の左側にあるボックスを選択します。 (キーボードの[shift]キーまたは[ctrl]キーを押して、複数の列を選択できます。)
- 列をテーブル内の別の場所にドラッグします。
次に、保存をクリックします。このメソッドは実際にテーブルを削除して再作成するため、エラーが発生する可能性があります。
Change Trackingオプションがデータベースとテーブルに対して有効になっている場合、この方法は使用しないでください。
無効になっている場合、テーブルの再作成を必要とする変更の保存を防ぐオプションは、ツールメニュー>オプション>デザイナでクリアする必要があり、そうでない場合「変更の保存は許可されていません」エラーが発生します。
主キーおよび外部キーの作成中にも問題が発生する場合があります。
上記のエラーのいずれかが発生すると、保存は失敗し、元の列の順序が残ります。
これは、クエリの結果のレコードの順序に関する質問に似ています..通常、誰も正式に正しい答えを好まない;-)
だからここに行く:
select *
は列を特定の順序で強制的に返しません。create table' or in the
alterテーブルの追加 `ステートメントもちろん、SQLステートメントの列の順序を変更できます。ただし、テーブルの物理的な列の順序を抽象化する場合は、ビューを作成できます。すなわち
CREATE TABLE myTable(
a int NULL,
b varchar(50) NULL,
c datetime NULL
);
CREATE VIEW vw_myTable
AS
SELECT c, a, b
FROM myTable;
select * from myTable;
a b c
- - -
select * from vw_myTable
c a b
- - -
SQLServer Management Studioの場合:
ツール->オプション->デザイナー->テーブルおよびデータベースデザイナー
次に:
SQLServer Management Studioはテーブルを削除し、データを使用してテーブルを再作成します。
それには、新しいテーブルを作成し、すべてのデータをコピーし、古いテーブルを削除してから、新しいテーブルの名前を変更して古いテーブルを置き換えます。
また、テーブルに新しい列を追加し、列データごとに列をコピーし、古い列をドロップしてから、新しい列の名前を古い列と一致するように変更することもできます。以下の簡単な例: http://sqlfiddle.com/#!3/67af4/1
CREATE TABLE TestTable (
Column1 INT,
Column2 VARCHAR(255)
);
GO
insert into TestTable values(1, 'Test1');
insert into TestTable values(2, 'Test2');
GO
select * from TestTable;
GO
ALTER TABLE TestTable ADD Column2_NEW VARCHAR(255);
ALTER TABLE TestTable ADD Column1_NEW INT;
GO
update TestTable
set Column1_NEW = Column1,
Column2_NEW = Column2;
GO
ALTER TABLE TestTable DROP COLUMN Column1;
ALTER TABLE TestTable DROP COLUMN Column2;
GO
sp_rename 'TestTable.Column1_NEW', 'Column1', 'COLUMN';
GO
sp_rename 'TestTable.Column2_NEW', 'Column2', 'COLUMN';
GO
select * from TestTable;
GO
SQL Server Management Studioの場合:
ツール->オプション->デザイナー->テーブルおよびデータベースデザイナー
「テーブルの再作成が必要な変更を保存しない」の選択を解除します。
これで、テーブルを並べ替えることができます。
SQLサーバーは、スクリプトを内部的に構築します。新しい変更を含む一時テーブルを作成し、データをコピーして現在のテーブルを削除してから、一時テーブルからテーブル挿入を再作成します。 「Generate Change script」オプションssms 2014から見つけました。このようなスクリプト。 From ここ:SQLクエリを使用してテーブルの列の順序を変更する方法
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_emps
(
id int NULL,
ename varchar(20) NULL
) ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_emps SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.emps)
EXEC('INSERT INTO dbo.Tmp_emps (id, ename)
SELECT id, ename FROM dbo.emps WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.emps
GO
EXECUTE sp_rename N'dbo.Tmp_emps', N'emps', 'OBJECT'
GO
COMMIT
テーブルに十分な列がある場合は、これを試すことができます。最初に、列の優先順序で新しいテーブルを作成します。
create table new as select column1,column2,column3,....columnN from table_name;
次に、dropコマンドを使用してテーブルを削除します
drop table table_name;
新しく作成したテーブルの名前を古いテーブル名に変更します。
rename new to table_name;
ここでテーブルを選択すると、以前のように列が再配置されます。
select * from table_name;
次の手順で実現できます。
元のテーブルのすべての外部キーと主キーを削除します。
元のテーブルの名前を変更します。
cTASを使用して、必要な順序で元のテーブルを作成します。
古いテーブルをドロップします。
元のテーブルにすべての制約を適用します
結局のところ、MS SQLでこれを行うことはできません。最近、ルックアップテーブルから読み取るストアドプロシージャを使用して、外出先(アプリケーションの起動)でテーブルを作成しました。これらを別のテーブルと組み合わせたビューを作成したときに、以前のテーブル(同じスキーマ、データ付き)を手動で作成しましたが、失敗しました-ビューに '' Select * UNION Select * 'を使用していたからです。同時に、ストアドプロシージャで作成したものだけを使用すれば、成功します。
結論として、列の順序に依存するアプリケーションがある場合、それは本当に良いプログラミングではなく、間違いなく将来的に問題を引き起こすでしょう。列はどこにでも自由に「感じ」て、データ処理(INSERT、UPDATE、SELECT)に使用する必要があります。
並べ替える列が最近作成されて空になっている場合は、列を削除して正しい順序で再追加できます。
これは、データベースを手動で拡張して新しい機能を追加するために起こりました。列を見逃していましたが、追加したときに順序が正しくありませんでした。
ここで適切な解決策が見つからなかったので、次の種類のコマンドを使用してテーブルを修正しました。
ALTER TABLE tablename DROP COLUMN columnname;
ALTER TABLE tablename ADD columnname columntype;
注:ドロップする列にデータがない場合にのみ、これを実行してください。
人々は、列の順序は重要ではないと言っています。私は定期的にSQL Server Management Studioの「スクリプトの生成」を使用して、データベースのスキーマのテキストバージョンを作成します。これらのスクリプトを効果的にバージョン管理(git)および比較(WinMerge)するには、互換性のあるデータベースからの出力が同じであり、強調表示されている違いが真のデータベースの違いであることが不可欠です。
列の順序は重要です。しかし、一部の人だけに、みんなにではありません!
このコマンドを試してください:
alter table students modify age int(5) first;
これにより、年齢の位置が最初の位置に変更されます。
特定の列の順序を設定するには、希望する順序で列ごとに選択する必要があります。選択順序により、出力での列の順序が決まります。
SQLクエリを使用してこれを変更できます。以下は、列の順序を変更するSQLクエリです。
ALTER TABLE table name
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;