Dapatkah saya menyusun ulang kolom dalam tabel secara logis?

93

Jika saya menambahkan kolom ke tabel di Microsoft SQL Server, dapatkah saya mengontrol di mana kolom ditampilkan secara logis dalam kueri?

Saya tidak ingin mengacaukan tata letak fisik kolom pada disk, tetapi saya ingin mengelompokkan kolom secara logis jika memungkinkan sehingga alat seperti SQL Server Management Studio mencantumkan konten tabel dengan cara yang nyaman.

Saya tahu bahwa saya dapat melakukan ini melalui SQL Management Studio dengan masuk ke mode "desain" untuk tabel dan menyeret urutan kolom, tetapi saya ingin melakukannya dalam SQL mentah sehingga saya dapat melakukan pengurutan ditulis dari baris perintah.

fastcall
sumber
Terlambat untuk sebuah jawaban tetapi lihat tautan ini. blog.sqlauthority.com/2013/03/11/…
sqluser
dan pertanyaan terkait lainnya, tentang apakah itu penting stackoverflow.com/questions/6692021/…
Tim Abell
microsoft connect: sintaks ALTER TABLE untuk mengubah urutan kolom - respons dari varietas teko coklat seperti biasa WONTFIX
Tim Abell

Jawaban:

78

Anda tidak dapat melakukan ini secara programatik (dengan cara yang aman) tanpa membuat tabel baru.

Apa yang dilakukan Manajer Perusahaan saat Anda melakukan pengubahan urutan adalah membuat tabel baru, memindahkan data, lalu menghapus tabel lama dan mengganti nama tabel baru ke nama yang sudah ada.

Jika Anda ingin kolom Anda dalam urutan / pengelompokan tertentu tanpa mengubah urutan fisiknya, Anda dapat membuat tampilan yang dapat menjadi apa pun yang Anda inginkan.

vzczc
sumber
43

Saya pikir apa yang hilang dari semua orang di sini, adalah bahwa meskipun tidak semua orang harus berurusan dengan 10, 20, atau 1000 contoh dari sistem perangkat lunak yang sama yang dipasang di seluruh negara dan dunia ... kita yang merancang perangkat lunak yang dijual secara komersial melakukannya. Akibatnya, kami memperluas sistem dari waktu ke waktu, memperluas tabel dengan menambahkan bidang saat kemampuan baru diperlukan, dan saat bidang tersebut diidentifikasi memang termasuk dalam tabel yang ada, dan dengan demikian, lebih dari satu dekade memperluas, menumbuhkan, menambahkan bidang, dll. ke tabel .... dan kemudian harus bekerja dengan tabel-tabel tersebut mulai dari desain, dukungan, hingga terkadang menggali data mentah / pemecahan masalah untuk men-debug bug fungsionalitas baru .... sangat menjengkelkan jika tidak memiliki informasi utama yang Anda inginkan lihat dalam beberapa bidang pertama,

Saya sering berharap saya bisa melakukan ini, untuk alasan yang tepat ini. Tetapi singkatnya melakukan persis apa yang dilakukan SQL, Membuat Buat Skrip untuk Tabel baru seperti yang saya inginkan, menulis Sisipan ke dalamnya, lalu menghapus semua batasan, hubungan, kunci, indeks, dll, dll yang ada dari tabel yang ada dan mengganti nama tabel "baru" kembali ke nama lama, lalu membaca semua kunci, hubungan, indeks, dll ....

Bukan hanya membosankan, menyita waktu tetapi ... dalam lima tahun lagi, akan perlu terjadi lagi ....

Ini sangat mendekati nilai pekerjaan yang sangat besar itu, namun intinya adalah ... ini tidak akan menjadi yang terakhir kali kita membutuhkan kemampuan ini, karena sistem kita akan terus tumbuh, berkembang, dan mendapatkan bidang dalam urutan yang aneh didorong oleh kebutuhan / tambahan desain.

Mayoritas pengembang berpikir dari sudut pandang sistem tunggal yang melayani satu perusahaan atau pasar kotak keras yang sangat spesifik.

Para perancang dan pemimpin pembangunan yang "tidak terpakai" tetapi sangat progresif dalam ruang pasar mereka akan selalu harus menghadapi masalah ini, berulang kali ..... akan menyukai solusi kreatif jika ada yang memilikinya. Ini dapat dengan mudah menghemat perusahaan saya selusin jam seminggu, hanya tidak perlu menggulir ke atas, atau mengingat di mana bidang "itu" ada di tabel data sumber ....

Philip Coyner
sumber
Kami memiliki masalah yang sama dan membuat prosedur tersimpan yang mengotomatiskan proses ini (mengganti nama, membuat tabel baru, menyalin, membuat ulang semua kunci asing, batasan, dll.). Anda hanya perlu memasukkan nama tablename dan kolom urutan baru. Jika ini benar-benar dapat menghemat waktu puluhan jam perusahaan Anda dalam seminggu, Anda harus menginvestasikan waktu untuk menulis skrip serupa. Bagi kami, hanya butuh sekitar 2-3 hari untuk memiliki skrip stabil yang rutin kami gunakan untuk menyusun ulang kolom. Ini menangani semua fitur yang kita gunakan di SqlServer (misalnya indeks parsial, tampilan yang diindeks, dll) dan hanya terdiri dari sekitar 400 LOC.
Andreas
1
Saya tidak tahu mengapa mereka tidak bisa mengabstraksi tata letak kolom. Tidak harus menyusun ulang kolom secara fisik! Jumlah tingkat PHD dan melampaui rekayasa di Sql Server benar-benar mencengangkan. Ketika Anda mempertimbangkan kompleksitas pembuatan rencana kueri, statistik, pengindeksan dan tidak ada yang berdiri dan berkata 'Mari kita buat tabel yang mewakili urutan LOGIS. FieldID Guid, OrderBy int. Selesai. Kemudian SSMS atau SELECT *gunakan itu. Matikan jika Anda seorang DBA yang sempurna dan tidak menginginkannya. Sangat membuat frustasi. Dan sekarang meja saya cukup besar sehingga saya tidak bisa memaksakannya lagi.
Simon_Weaver
Saya tahu ini adalah komentar lama, tetapi studio visual dalam proyek database secara otomatis membuat skrip SQL untuk menyusun ulang kolom fisik ketika Anda mengubah skema tabel dan menekan terbitkan.
Muflix
5

Jika saya memahami pertanyaan Anda, Anda ingin memengaruhi kolom apa yang dikembalikan pertama, kedua, ketiga, dll. Yang ada kueri yang , bukan?

Jika semua pertanyaan Anda ditulis dengan SELECT * FROM TABLE - maka akan muncul di output seperti yang ditata dalam SQL.

Jika kueri Anda ditulis dengan SELECT Field1, Field2 FROM TABLE- maka urutannya dalam SQL tidak menjadi masalah.

Otto
sumber
3

Ketika Management Studio melakukannya, itu membuat tabel sementara, menyalin semuanya, menjatuhkan tabel asli Anda dan mengganti nama tabel sementara. Tidak ada pernyataan T-SQL sederhana yang setara.

Jika Anda tidak suka melakukan itu, Anda selalu dapat membuat tampilan tabel dengan kolom sesuai urutan yang Anda inginkan dan menggunakannya?

Edit: dipukuli!

tags2k
sumber
1

Ada satu cara, tetapi hanya sementara untuk kueri itu sendiri. Sebagai contoh,

Katakanlah Anda memiliki 5 tabel. Tabel disebutT_Testing

FirstName, LastName, PhoneNumber, Email, dan Member_ID

Anda ingin mencantumkan ID mereka, lalu Nama Belakang, lalu Nama Depan, lalu Telepon lalu Email.

Anda dapat melakukannya sesuai Select.

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

Selain itu, jika Anda hanya ingin Nama Belakang untuk Ditampilkan sebelum nama depan karena alasan tertentu, Anda juga dapat melakukannya sebagai berikut:

Select LastName, *
From T_Testing

Satu-satunya hal yang ingin Anda lakukan adalah memastikan bahwa Fungsi OrderBy atau Where perlu dilambangkan sebagai Table.Column jika Anda akan menggunakan Where atau OrderBy

Contoh:

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

Saya harap ini membantu, saya mengetahuinya karena saya perlu melakukan ini sendiri.

Steven
sumber
Dalam query ini Select LastName, * Dari T_Testing, Anda mendapatkan LastName dua kali.
sqluser
1
  1. Skrip tabel Anda yang ada ke jendela kueri.
  2. Jalankan skrip ini pada database Test (hapus pernyataan Use)
  3. Gunakan SSMS untuk membuat perubahan kolom yang Anda butuhkan
  4. Klik Buat Skrip Perubahan (ikon paling kiri dan paling bawah pada bilah tombol, secara default)
  5. Gunakan skrip ini di atas meja Anda yang sebenarnya

Yang benar-benar dilakukan skrip adalah membuat tabel tabel kedua dengan urutan kolom yang diinginkan, menyalin semua data Anda ke dalamnya, menghapus tabel asli, dan kemudian mengganti nama tabel sekunder untuk menggantikannya. Ini menghemat Anda menulisnya sendiri meskipun jika Anda menginginkan skrip penerapan.

Paul
sumber
0

Ini dapat dilakukan menggunakan SQL, dengan memodifikasi tabel sistem secara langsung. Misalnya, lihat di sini:

Alter table - Tambahkan kolom baru di antaranya

Namun, saya tidak akan merekomendasikan bermain dengan tabel sistem, kecuali benar-benar diperlukan.

Milan Babuškov
sumber
0

Tidak mungkin mengubah urutan kolom tanpa membuat ulang seluruh tabel. Jika Anda memiliki beberapa contoh database saja, Anda dapat menggunakan SSMS untuk ini (Pilih tabel dan klik "desain").

Jika Anda memiliki terlalu banyak contoh untuk proses manual, Anda harus mencoba skrip ini: https://github.com/Epaminaidos/reorder-columns

Andreas
sumber