SQL Server 2005でSQLクエリを使用してテーブルの列の順序を変更する方法


109

SQL Server 2005でSQLクエリを使用してテーブルの列の順序を変更する方法

SQLクエリを使用して、テーブルの列の順序を並べ替えたい。


3
テーブルに存在する列の位置を変更する場合は、優先順位を付けて新しいテーブルを作成し、古いテーブルからデータを挿入して、元のテーブルを削除する必要があります。それを行うには(私の知る限り)他の方法はありません。
マイケル・トッド

SELECTステートメントの列の順序、またはテーブル定義の列の順序について話していますか?
marc_s 2009年

回答:


111

できません。列の順序は、私たちが人間が気にする「化粧品」のことです-SQL Serverにとって、ほとんど常に絶対に無関係です。

列の順序を変更したときにSQL Server Management Studioがバックグラウンドで実行することは、新しいCREATE TABLEコマンドを使用してテーブルを最初から再作成し、古いテーブルからデータをコピーしてから削除することです。

列の順序を定義するSQLコマンドはありません。


4
いや、そこにはそのような事NI SQL Serverがいない-と任意の実際RBDMSにすべきではない-列の順序は、SQLテーブルに関連性の概念ではありません
marc_s

68
@marc_s列の順序をサポートすることに正当な理由はありません。それが視覚的なものであっても。"SELECT *"を実行すると、特定の列の順序でテーブル内のデータを簡単に確認できるようになります。私は開発者であり、常にこの種のクエリを実行しています。事前に定義された適切な列順序を使用すると、時間を節約できます。もちろん、他の観点から見ると、意味がありません。列の順序に依存するものはありません。ちなみに、「INFORMATION_SCHEMA.COLUMNS」をクエリすると、ORDINAL_POSITION列があります。どういう意味かはわかりませんが…何か関係があるのではないでしょうか。
JotaBe 2013年

18
列の順序は、列名を指定せずにINSERT INTOを使用する場合などに関係します。別の例は、列名の代わりにORDER BY列インデックスです。どちらも明らかに推奨される方法ではありませんが、SQL Serverでは許可されているため、誰かがどこかで使用した可能性があり、列の順序を変更するとT-SQLコードが破損する可能性があります。
Carvellis 14

12
@Carvelis:あなたがすべき決して使用しないでINSERT明示的に列を指定せずに、とにかく!
marc_s 2014

2
@marc_s:もちろんですが、プロジェクトに取り組んでいるのは私だけではありません。人々がこの種のコードを使用しているプロジェクトはかなりたくさんあります。
Carvellis 14

30

「デフォルト」の順序に*を使用する代わりに、フィールドを返す順序で明示的にリストする必要があります。

元のクエリ:

select * from foobar

戻り値

foo bar
--- ---
  1   2

書いて

select bar, foo from foobar

bar foo
--- ---
  2   1

上記の答えは間違っていますか?この回答は文字列を並べ替える方法を文字通り示していますが、なぜ前のものにはチェックマークがあり、これにはありませんか?
エージェントLu、

1
@Agent Lu問題は元の質問の文言です。マークと私は、「列の順序を変更する」というOPの質問を異なる方法で解釈しました。彼は、格納されたテーブルで列の順序が無関係である理由を強く主張しています(名前はそうです)。異なる列の順序でデータを抽出する方法を示しました。まったく同じではありません!
lexu

23

http://msdn.microsoft.com/en-us/library/aa337556.aspxによると

このタスクは、Transact-SQLステートメントの使用はサポートされていません。

まあ、komma8.komma1で答えられたようにcreate/ copy //drop rename を使用してそれを行うことができます

または、SQL Server Management Studioを使用できます

  1. では、オブジェクトエクスプローラ、列を持つテーブルを右クリックして、あなたは順序を変更し、クリックしますデザイン(版で修正を。2005 SP1またはそれ以前)
  2. 並べ替える列名の左側にあるボックスを選択します。(キーボードの[shift]キーまたは[ctrl]キーを押し続けると、複数の列を選択できます。)
  3. 列をテーブル内の別の場所にドラッグします。

次に[保存]をクリックします。このメソッドは実際にテーブルを削除して再作成するため、いくつかのエラーが発生する可能性があります。

場合は変更の追跡オプションがデータベースとテーブルのために有効になっている、あなたは、このメソッドを使用しないでください。

無効になっている場合は、[ツール]メニュー> [オプション]> [デザイナー]で、[ テーブルの再作成を必要とする変更を保存できないようにする]オプションをオフにする必要があります。「変更の保存は許可されていません」エラーが発生します。

  • テーブルの再作成を必要とする変更を保存できないようにするオプションを無効にすると、テーブルの再作成時に既存の変更追跡情報が削除されるため、変更追跡が無効になっている場合はこのオプションを無効にしないでください。有効になりました!

主キーおよび外部キーの作成中に問題が発生することもあります。

上記のエラーのいずれかが発生した場合、保存は失敗し、元の列の順序が残ります。


1
This task cannot be performed using Transact-SQL statements.ドキュメント内の「」の記述は間違っていました。作者を説明し、「This task is not supported using Transact-SQL statements.」に変更するよう依頼しました。約1日前、著者は同意し、ドキュメントは修正されました。GitHubでのディスカッションをフォローできます
Ronen Ariely

@RonenAriely良い仕事、そして私に知らせてくれてありがとう。回答を更新しました
robotik

@robotik mostは大歓迎です。ここに来て、最も多くの票を獲得した回答を見たすべての人が、それが完全な間違いであることを理解してくれることを願っています。残念ながら、コミュニティは通常群れ(牛)のように振る舞い、コミュニティのリーダーとトップの貢献者(トップエキスパートと見なされます)がミスをすると、このスレッドのように他の人がフォローします。すでに多くの票を獲得している場合は人々は間違いに投票し続け(「みんながそう言うので、それは本当です」のアプローチ)、フォーラムに来る他の人々はこれが正しい答えであると考えます。
Ronen Ariely

1
@RonenArielyそれが私がいつも下にスクロールする理由です:)
robotik '22

13

これは、クエリの結果でのレコードの順序付けに関する質問に似ています..通常、正式な正解は誰も好きではありません;-)

だからここに行く:

  • SQL標準に従って、テーブルの列は「順序付け」されていません
  • その結果、a select *は特定の順序で列を強制的に返しません。
  • 通常、各RDBMSには一種の「デフォルト」の順序(通常、列がテーブルに追加された順序、create table' or in thealter table add `ステートメントのいずれかで)
  • したがって、列の順序に依存している場合(クエリの結果を使用して、列の位置から他のデータ構造をポピュレートしているため)、必要な順序で列を明示的にリストします。

11

もちろん、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
-  -  -

これはクエリ時間を変更しますか?
ブラインドガイ2016

@blindguyいいえ、クエリ時間は変わりません
mevdiven

9

SQLServer Management Studioで:

ツール->オプション->デザイナ->テーブルおよびデータベースデザイナ

  • 「テーブルの再作成が必要な変更を保存できないようにする」の選択を解除します。

次に:

  • 列を並べ替えるテーブルを右クリックします。
  • 「デザイン」をクリックします。
  • 列を希望の順序にドラッグします。
  • 最後に、[保存]をクリックします。

SQLServer Management Studioはテーブルを削除し、データを使用して再作成します。


6

これを行うには、新しいテーブルを作成し、すべてのデータをコピーし、古いテーブルを削除してから、新しいテーブルの名前を変更して古いテーブルを置き換えます。

また、新しい列をテーブルに追加し、列データごとに列をコピーし、古い列を削除してから、新しい列の名前を変更して古い列と一致させることもできます。以下の簡単な例: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

1
私は同じようなことをするストアドプロシージャを書きました。動的SQLを使用してテーブルの再構築を自動化します。caseyplummer.wordpress.com/2013/07/22/...
ケーシー・プラマー

6

SQLServer Management Studioで:

Tools-> Options-> Designers->Table and Database Designers

選択を解除しPrevent saving changes that require table re-creationます。

これで、テーブルを並べ替えることができます。


2

SQLサーバーは内部でスクリプトを作成します。新しい変更で一時テーブルを作成し、データをコピーして現在のテーブルを削除し、一時テーブルからテーブル挿入を再作成します。「変更スクリプトの生成」オプションssms 2014からそれを見つけます。このようなスクリプト。ここから: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

1

テーブルに十分な列がある場合は、これを試すことができます。最初に、列の優先順で新しいテーブルを作成します。

    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;

これは、新しいテーブルの作成、既存のテーブルから新しいテーブルへのデータのコピー、古いテーブルの削除、新しいテーブルの名前変更と同じです。厳密に言えば、これはテーブルの列の順序を変更するものではありません。これは古いテーブルから作成/コピーするため、巨大なテーブルには時間がかかります。最後に重要なことですが、提案された構文はt-sqlでは機能しません。
ジャン=フランソワ・

0

結局のところ、これをMS SQLで行うことはできません。最近、ルックアップテーブルから読み取るストアドプロシージャを使用して、外出先(アプリケーションの起動)でテーブルを作成しました。これらを以前に手動で作成した別のテーブルと組み合わせたビュー(同じスキーマ、データを含む)を作成すると、ビューに '' Select * UNION Select * 'を使用していたために失敗しました。同時に、ストアドプロシージャで作成したものだけを使用すれば、成功します。

結論:列の順序に依存するアプリケーションがある場合、それは本当に良いプログラミングではなく、将来的に問題が発生することは間違いありません。列はどこにでも自由に「感じる」ことができ、あらゆるデータ処理(INSERT、UPDATE、SELECT)に使用できます。


0

あなたはこれらのステップでそれを達成することができます:

  1. 元のテーブルのすべての外部キーと主キーを削除します。

  2. 元のテーブルの名前を変更します。

  3. CTASを使用して、元のテーブルを必要な順序で作成します。

  4. 古いテーブルを削除します。

  5. すべての制約を元のテーブルに適用します


0

並べ替える列が最近作成されて空になっている場合は、列を削除して、正しい順序で再度追加できます。

これは私に起こり、データベースを手動で拡張して新しい機能を追加しましたが、列が抜けていたので、追加したときにシーケンスが正しくありませんでした。

ここで適切な解決策が見つからなかった後、私は次の種類のコマンドを使用してテーブルを単に修正しました。

ALTER TABLE  tablename  DROP COLUMN  columnname; 
ALTER TABLE  tablename  ADD columnname columntype;

注:ドロップする列にデータがない場合にのみ、これを行ってください。

列の順序は重要ではないと人々は言っています。SQL Server Management Studioの「スクリプトの生成」を定期的に使用して、データベーススキーマのテキストバージョンを作成しています。これらのスクリプト(git)を効果的にバージョン管理し、それらを比較(WinMerge)するには、互換性のあるデータベースからの出力が同じであり、強調表示されている違いが本物のデータベースの違いであることが不可欠です。

列の順序は重要です。だけでなく、一部の人にだけではなく、すべての人に!


0

新しい列を特定の位置に追加したいと思います。現在の列を右に移動して、新しい列を作成できます。

+---+---+---+
| A | B | C |
+---+---+---+

影響を受けるすべてのインデックスと外部キー参照を削除します。最後の列とまったく同じデータ型の新しい列を追加し、そこにデータをコピーします。

+---+---+---+---+
| A | B | C | C |
+---+---+---+---+
          |___^

3番目の列のデータ型を前の列と同じ型に変更し、そこにデータをコピーします。

+---+---+---+---+
| A | B | B | C | 
+---+---+---+---+
      |___^

それに応じて列の名前を変更し、削除されたインデックスと外部キー参照を再作成します。

+---+---+---+---+
| A | D | B | C | 
+---+---+---+---+

2番目の列のデータ型を変更します。

marc_sが 言ったように、列の順序は単なる「装飾的な」ものであることに注意してください


-1

使用する

SELECT * FROM TABLE1

これは、テーブルのデフォルトの列順序を表示します。

列の順序を変更したい場合。

表示する列名を指定してください

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1

問題は一時的な注文ではありません。質問は、テーブルを変更して新しい列を追加するときのテーブル設計構造についてです。
vikas Chaturvedi

-1

索引付けを使用できます。索引付け後、select * from XXXXの結果が索引のとおりである必要がありますが、結果セットのみです。Tableの構造ではありません。


-1

SQLクエリを使用してこれを変更できます。列のシーケンスを変更するSQLクエリは次のとおりです。

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;

これはSSMSのようにテーブルを削除して再作成するのでしょうか。どちらの方法でも、実動DBでこれを行うダイスを振るつもりはありませんが、この方法は興味深いものであり、調査する価値があります。
samis

OPで指定されているように、この機能はSQL Serverでは機能しません。それがしたいと思います。
Bill

1
これはMySQL構文であり、SQL Serverではありません。
Jon Schneider


-1

このコマンドを試してください:

alter table students modify age int(5) first; 

これにより、年齢の位置が最初の位置に変わります。


これはMSSQLの有効なSQLではありません。MySQLか他の方言かもしれませんが、SQL Server 2005はそうではありません
nsimeonov

-2

まずテーブル名を変更し、columnname int(5)を最初に変更します。最初に列を変更し、(tablename)の後にテーブル名を変更しますcolumnname int(5)を変更します。


-3

例:テーブルステータスのfield_priceの後のfield_priorityの位置を変更します。

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;

2
これはMySQL構文であり、SQL Serverではありません。
Jon Schneider
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.