テーブルの列を論理的に並べ替えることはできますか?


93

Microsoft SQL Serverのテーブルに列を追加する場合、クエリで列が論理的に表示される場所を制御できますか?

ディスク上の列の物理的なレイアウトを変更したくありませんが、SQL Server Management Studioなどのツールがテーブルのコンテンツを便利な方法で一覧表示できるように、可能な場合は列を論理的にグループ化したいと思います。

テーブルの「デザイン」モードに入り、列の順序をドラッグすることで、SQL Management Studioを使用してこれを実行できることを知っていますが、生のSQLで実行できるようにして、順序を実行できるようにしたいと思います。コマンドラインからスクリプト化されます。


回答には遅すぎますが、このリンクをご覧ください。blog.sqlauthority.com/2013/03/11/…– sqluser
1



そしてそれが重要かどうかについての別の関連する質問、stackoverflow.com
Tim Abell

microsoft connect:列の順序を変更するためのALTER TABLE構文 -応答は通常どおりチョコレートティーポットの種類ですWONTFIX
Tim Abell

回答:


77

新しいテーブルを作成せずに、プログラムで(つまり、安全な方法で)これを行うことはできません。

並べ替えをコミットするときにEnterprise Managerが行うことは、新しいテーブルを作成し、データを移動してから古いテーブルを削除し、新しいテーブルの名前を既存の名前に変更することです。

物理的な順序を変更せずに列を特定の順序/グループにしたい場合は、任意のビューを作成できます。


43

私はここに誰もが欠けていると思いますが、国や世界中にインストールされている同じソフトウェアシステムの10代、20代、または1000代のインスタンスに誰もが対処する必要があるわけではありません。その結果、システムを徐々に拡張し、新しい機能が必要になったときにフィールドを追加してテーブルを拡張します。これらのフィールドが特定された場合、既存のテーブルに属しているため、10年以上にわたってフィールドの拡張、拡張、追加などを行います。テーブルへ....次に、これらのテーブルを設計からサポート、サポート、場合によっては生データの調査/トラブルシューティングまで行って新しい機能のバグをデバッグする必要があります....必要な主要な情報がないと、非常に悪化します。最初の一握りのフィールド内を参照してください。

この正確な理由で、私はこれができることをしばしば望んでいました。しかし、SQLの機能を正確に実行するのではなく、新しいテーブルの作成スクリプトを希望どおりに作成し、それにInsertを書き込み、既存のテーブルから既存の制約、関係、キー、インデックスなどをすべて削除して、名前を変更します。 「新しい」テーブルを古い名前に戻し、それらのキー、関係、インデックスなどをすべて読み取ります...

面倒で時間がかかるだけでなく、... 5年後には、再び発生する必要があります....

それは膨大な量の作業の価値に非常に近いですが、要点は...この能力が必要になるのはこれが最後ではないということです。ニーズ/デザインの追加。

開発者の大多数は、単一の企業または非常に特定のハードボックス市場にサービスを提供する単一のシステムの観点から考えています。

「既製」でありながら大幅に進歩的なデザイナーとその市場空間における開発のリーダーは、常にこの問題に何度も何度も対処する必要があります。これにより、スクロールせずに会社を週に数十時間節約したり、「その」フィールドがソースデータテーブルのどこにあるかを覚えたりできます。


同じ問題があり、このプロセスを自動化するストアドプロシージャを作成しました(名前の変更、新しいテーブルの作成、すべての外部キー、制約などのコピー、再作成など)。テーブル名と列の新しい順序を渡すだけで済みます。これにより実際に週に数十時間も節約できる場合は、同様のスクリプトを作成する時間を費やす必要があります。私たちにとって、列を並べ替えるために日常的に使用する安定したスクリプトを作成するには、約2〜3日しかかかりませんでした。これは、SqlServerで使用するすべての機能(部分的なインデックス、インデックス付きビューなど)を処理し、約400のLOCのみで構成されます。
Andreas

どういうわけか、列のレイアウトを抽象化できない理由はわかりません。列を物理的に並べ替える必要はありません。SQL ServerのPHDレベルとそれ以上のエンジニアリングの量は本当に驚くべきものです。クエリプラン生成の複雑さ、統計、インデックス作成、誰も立ち上がっていないことを考えると、「論理的な順序を表すテーブルを作成できます。FieldID GuidOrderBy int。できました。次にSSMSまたはそれをSELECT *使用します。完璧なDBAで、それを望まない場合は、オフにしてください。とてもイライラします。そして今、私のテーブルは、私がそれを総当たりすることができないほど十分に大きいです。
Simon_Weaver

これは古いコメントですが、データベースプロジェクト内のVisual Studioは、テーブルのスキーマを変更してパブリッシュをヒットすると、物理列の並べ替え用のSQLスクリプトを自動的に作成します。
Muflix

5

あなたの質問を理解したら、既存のクエリで最初に、2番目、3番目などに返される列に影響を与えたいと思いませんか?

すべてのクエリがSELECT * FROM TABLE-で記述されている場合、それらはSQLでレイアウトされるときに出力に表示されます。

クエリがSELECT Field1, Field2 FROM TABLE-で記述されている場合、SQLでのレイアウトの順序は重要ではありません。


3

Management Studioがこれを行うと、一時テーブルが作成され、すべてがコピーされ、元のテーブルが削除され、一時テーブルの名前が変更されます。単純な同等のT-SQLステートメントはありません。

そうしたくない場合は、いつでも好きな順序で列を含むテーブルのビューを作成し、それを使用できますか?

編集:打たれた!


1

1つの方法がありますが、それは一時的にクエリ自体に対してのみです。例えば、

5つのテーブルがあるとします。テーブルが呼び出されますT_Testing

FirstName、LastName、PhoneNumber、Email、Member_ID

ID、姓、名、電話、メールの順にリストに表示させます。

選択に従って行うことができます。

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

それ以外に、何らかの理由で姓の前に姓を表示したい場合は、次のように行うこともできます。

Select LastName, *
From T_Testing

WhereやOrderByを使用する場合は、必ずOrderByまたはWhere関数をTable.Columnと表記する必要があることを確認してください。

例:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

これが役に立てば幸いです。自分で行う必要があったので、わかりました。


このクエリでは、LastNameを選択します。* T_Testingから、LastNameを2回取得します。
sqluser

1
  1. 既存のテーブルをクエリウィンドウにスクリプト化します。
  2. このスクリプトをテストデータベースに対して実行します(Useステートメントを削除します)
  3. SSMSを使用して必要な列を変更する
  4. 「変更スクリプトの生成」をクリックします(デフォルトでは、ボタンバーの一番左と一番下のアイコン)
  5. このスクリプトを実際のテーブルに対して使用します

スクリプトが実際に行うことは、目的の列の順序で2番目のテーブルテーブルを作成し、そこにすべてのデータをコピーし、元のテーブルを削除してから、代わりにセカンダリテーブルの名前を変更することです。これにより、デプロイスクリプトが必要な場合でも、自分で作成する手間が省けます。



0

テーブル全体を再作成せずに列の順序を変更することはできません。データベースのインスタンスがいくつかある場合は、SSMSを使用できます(テーブルを選択して[設計]をクリックします)。

手動プロセスに対してインスタンスが多すぎる場合は、次のスクリプトを試してください:https : //github.com/Epaminaidos/reorder-columns

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