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

StackOverflow https://stackoverflow.com/questions/1610

  •  08-06-2019
  •  | 
  •  

質問

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

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

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

役に立ちましたか?

解決

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

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

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

他のヒント

ここにいる全員が欠けているのは、誰もが国中や世界中にインストールされている同じソフトウェア システムの 10 年、20 年、または 1000 年単位のインスタンスに対処する必要があるわけではないということだと思います...市販のソフトウェアを設計する私たちもそうしています。その結果、私たちは時間の経過とともにシステムを拡張し、新しい機能が必要になったときにフィールドを追加してテーブルを拡張し、それらのフィールドが特定されると既存のテーブルに属するため、10 年以上にわたって拡張、拡張、フィールドの追加などを行ってきました。テーブルに....そして、設計からサポートに至るまで、それらのテーブルを操作しなければならず、時には生データを掘り下げたり、新機能のバグをデバッグするためのトラブルシューティングを行ったりする必要があります。厳密に正規化されたデータベースに 30 ~ 40 ~ 50、さらには 90 個のフィールドがあるテーブルがある場合に、最初の少数のフィールド内に表示したい主要な情報が含まれていないことは、信じられないほど厄介です。

私もこれができたらいいのにと何度も思ってきました。まさにこの理由からです。ただし、SQL の動作を正確に行うには至らず、希望どおりに新しいテーブルの作成スクリプトを構築し、そこに挿入を書き込み、既存の制約、関係、キー、インデックスなどをすべて既存のテーブルから削除して名前を変更します。 「新しい」テーブルを古い名前に戻してから、それらのキー、関係、インデックスなどをすべて読み取ります。

面倒で時間がかかるだけでなく...あと5年もすれば、また同じことが起こるだろう...

その膨大な作業の価値はほとんどありませんが、重要なのは...この機能が必要になるのはこれが最後ではありません。システムは今後も成長し、拡張し、必要性や設計の追加に応じてフィールドを異常な順序で取得し続けるからです。

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

「既製」ではあるが非常に進歩的なデザイナーや市場分野の開発リーダーは、常にこの問題に何度も何度も対処しなければならないでしょう。創造的な解決策を持っている人がいるなら、それを欲しがるでしょう。これにより、スクロールしたり、ソース データ テーブルの「その」フィールドがどこにあるかを覚えたりする必要がなくなるだけで、私の会社は週に十数時間を簡単に節約できます。

質問の内容が理解できれば、最初、2 番目、3 番目などに返される列に影響を与えたいということになります。 既存 クエリですよね?

すべてのクエリが次のように記述されている場合、 SELECT * FROM TABLE - SQL でレイアウトされたとおりに出力に表示されます。

クエリが次のように書かれている場合 SELECT Field1, Field2 FROM TABLE - SQL 内で配置される順序は重要ではありません。

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

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

編集:殴られた!

方法は 1 つありますが、それはクエリ自体に対する一時的なものにすぎません。例えば、

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

名、姓、電話番号、電子メール、および 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

これがお役に立てば幸いです。これは自分で行う必要があったので考え出しました。

  1. 既存のテーブルをクエリ ウィンドウにスクリプト化します。
  2. このスクリプトをテスト データベースに対して実行します (Use ステートメントを削除します)。
  3. SSMS を使用して必要な列変更を行う
  4. 変更]スクリプトの生成をクリックします(デフォルトでButtonBarのほとんどのものとBottommostアイコンを残します)
  5. このスクリプトを実際のテーブルに対して使用します

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

これは、SQL を使用してシステム テーブルを直接変更することで実行できます。たとえば、ここを見てください。

テーブルの変更 - 間に新しい列を追加します

ただし、どうしても必要な場合を除き、システム テーブルを使用することはお勧めしません。

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top