Bagaimana cara mengubah urutan kolom dalam tabel menggunakan query sql di sql server 2005?

109

Bagaimana cara mengubah urutan kolom dalam tabel menggunakan kueri SQL di SQL Server 2005?

Saya ingin mengatur ulang urutan kolom dalam tabel menggunakan kueri SQL.

Himadri
sumber
3
Jika Anda mengacu pada mengubah posisi kolom seperti yang ada di tabel, Anda harus membuat tabel baru dengan urutan yang diinginkan, memasukkan data dari tabel lama, lalu melepaskan tabel asli. Tidak ada cara lain (sepengetahuan saya) untuk melakukan itu.
Michael Todd
Apakah Anda berbicara tentang urutan kolom pada pernyataan SELECT, atau urutan kolom pada definisi tabel?
marc_s

Jawaban:

111

Kamu tidak bisa. Urutan kolom hanyalah "kosmetik" yang kita pedulikan - bagi SQL Server, itu hampir selalu sama sekali tidak relevan.

Apa yang dilakukan SQL Server Management Studio di latar belakang saat Anda mengubah urutan kolom adalah membuat ulang tabel dari awal dengan CREATE TABLEperintah baru , menyalin data dari tabel lama, lalu menghapusnya.

Tidak ada perintah SQL untuk menentukan urutan kolom.

marc_s
sumber
4
Tidak, tidak ada hal seperti itu ni SQL Server - dan tidak boleh ada dalam RBDMS nyata - urutan kolom bukanlah konsep yang relevan dengan tabel SQL
marc_s
68
@marc_s Tidak ada alasan yang baik untuk mendukung urutan kolom. Meski hanya visual. Ini hanya mempermudah untuk melihat data dalam tabel dengan urutan kolom tertentu saat Anda membuat "PILIH *". Saya seorang pengembang dan melakukan pertanyaan seperti ini sepanjang waktu. Anda dapat meluangkan waktu dengan urutan kolom yang telah ditentukan sebelumnya. Dari sudut pandang lain, tentu saja, ini tidak masuk akal: tidak ada yang harus bergantung pada urutan kolom. Ngomong-ngomong, ada kolom ORDINAL_POSITION qketika Anda meminta "INFORMATION_SCHEMA.COLUMNS". Aku tidak tahu apa artinya ... tapi pasti ada hubungannya dengan ini.
JotaBe
18
Urutan kolom relevan misalnya saat menggunakan INSERT INTO tanpa menentukan nama kolom. Contoh lainnya adalah ORDER BY indeks kolom, bukan nama kolom. Keduanya jelas bukan praktik yang direkomendasikan, tetapi SQL Server mengizinkannya sehingga seseorang mungkin telah menggunakannya di suatu tempat, mungkin melanggar kode T-SQL saat mengubah urutan kolom.
Carvellis
12
@Carvelis: Anda TIDAK PERNAH menggunakan INSERTtanpa menentukan kolom Anda secara eksplisit!
marc_s
2
@marc_s: tentu saja, tapi saya biasanya bukan satu-satunya yang mengerjakan sebuah proyek. Saya telah melihat beberapa proyek di mana orang-orang menggunakan kode semacam ini.
Carvellis
30

Anda harus secara eksplisit mencantumkan bidang dalam urutan yang Anda inginkan untuk dikembalikan daripada menggunakan * untuk urutan 'default'.

kueri asli:

select * from foobar

kembali

foo bar
--- ---
  1   2

sekarang Tulis

select bar, foo from foobar

bar foo
--- ---
  2   1
lexu
sumber
Jawaban diatas salah bukan? Jawaban ini secara harfiah menunjukkan bagaimana mengurutkan kolom, mengapa yang sebelumnya memiliki tanda centang dan yang ini tidak?
Agen Lu
1
@Agent Lu Masalahnya adalah kata-kata dari pertanyaan aslinya. Marc dan saya telah menafsirkan pertanyaan OP untuk 'mengubah urutan kolom' secara berbeda. Dia membuat argumen yang kuat mengapa urutan kolom tidak relevan dalam tabel yang disimpan (meskipun nama). Saya menunjukkan bagaimana data dapat diekstraksi dalam urutan kolom yang berbeda. Sama sekali tidak sama!
lexu
23

menurut http://msdn.microsoft.com/en-us/library/aa337556.aspx

Tugas ini tidak didukung menggunakan pernyataan Transact-SQL.

Nah, itu bisa dilakukan, dengan menggunakan create/ copy / drop/ rename, seperti yang dijawab oleh komma8.komma1

Atau Anda dapat menggunakan SQL Server Management Studio

  1. Di Object Explorer , klik kanan tabel dengan kolom yang ingin Anda susun ulang dan klik Design (Modify in ver. 2005 SP1 atau lebih lama)
  2. Pilih kotak di sebelah kiri nama kolom yang ingin Anda susun ulang. (Anda dapat memilih beberapa kolom dengan menahan tombol [shift] atau [ctrl] pada keyboard Anda.)
  3. Seret kolom ke lokasi lain di dalam tabel.

Lalu klik simpan. Metode ini sebenarnya menghapus dan membuat ulang tabel, jadi beberapa kesalahan mungkin terjadi.

Jika opsi Ubah Pelacakan diaktifkan untuk database dan tabel, Anda tidak boleh menggunakan metode ini.

Jika dinonaktifkan, opsi Cegah penyimpanan perubahan yang memerlukan pembuatan ulang tabel harus dikosongkan dalam menu Alat> Opsi> Desainer, jika tidak, kesalahan "Menyimpan perubahan tidak diizinkan" akan terjadi.

  • Menonaktifkan opsi Cegah penyimpanan perubahan yang memerlukan opsi pembuatan ulang tabel sangat tidak disarankan oleh Microsoft, karena ini mengarah ke informasi pelacakan perubahan yang ada yang dihapus saat tabel dibuat ulang, jadi Anda tidak boleh menonaktifkan opsi ini jika Ubah Pelacakan diaktifkan!

Masalah juga dapat muncul selama pembuatan kunci primer dan asing.

Jika salah satu kesalahan di atas terjadi, penyimpanan gagal yang membuat Anda dengan urutan kolom asli.

robotik
sumber
1
Pernyataan " This task cannot be performed using Transact-SQL statements." dalam dokumen itu salah. Saya menjelaskan penulisnya dan memintanya untuk mengubahnya menjadi " This task is not supported using Transact-SQL statements.". Sekitar sehari yang lalu, penulis setuju dan dokumen itu diperbaiki. Anda dapat mengikuti diskusi yang kami lakukan di GitHub .
Ronen Ariely
@RonenAriely kerja bagus, dan terima kasih telah memberi tahu saya. Saya memperbarui jawaban saya
robotik
Sama-sama @robotik 😀. Saya berharap semua yang datang ke sini dan melihat tanggapan dengan suara terbanyak akan mengerti bahwa ini adalah kesalahan total. Sayangnya, Komunitas biasanya berperilaku seperti kawanan (sapi) dan pernah seorang pemimpin dan kontributor teratas (yang dianggap ahli top) di komunitas tersebut melakukan kesalahan, kemudian yang lain mengikutinya, seperti yang terjadi di thread ini. Orang terus memilih kesalahan jika sudah mendapat banyak suara (pendekatan: "karena semua orang berkata demikian, maka itu benar"), dan orang lain yang akan datang ke forum akan berpikir bahwa ini adalah jawaban yang benar.
Ronen Ariely
1
@RonenAriely itu sebabnya saya selalu scroll ke bawah :)
robotik
13

Ini mirip dengan pertanyaan tentang mengurutkan record dalam hasil query .. dan biasanya tidak ada yang menyukai jawaban yang benar secara formal ;-)

Jadi begini:

  • sesuai standar SQL, kolom dalam tabel tidak "diurutkan"
  • Akibatnya, a select * tidak memaksa kolom dikembalikan dalam urutan tertentu
  • biasanya, setiap RDBMS memiliki jenis urutan "default" (biasanya urutan kolom ditambahkan ke tabel, baik di create table' or in the alter tabel tambahkan `
  • Oleh karena itu, jika Anda mengandalkan urutan kolom (karena Anda menggunakan hasil kueri untuk mem-poulate beberapa struktur data lain dari posisi kolom), secara eksplisit daftarkan kolom dalam urutan yang Anda inginkan.
Thorsten
sumber
11

Anda tentu saja dapat mengubah urutan kolom dalam pernyataan sql. Namun jika Anda ingin membuat urutan kolom fisik tabel abstrak, Anda dapat membuat tampilan. yaitu

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
-  -  -
mevdiven
sumber
apakah ini mengubah waktu kueri?
blindguy
@blindguy tidak itu tidak mengubah waktu kueri Anda
mevdiven
9

Di SQLServer Management Studio:

Alat -> Opsi -> Desainer -> Desainer Tabel dan Database

  • Batalkan pilihan 'Cegah penyimpanan perubahan yang memerlukan pembuatan ulang tabel'.

Kemudian:

  • klik kanan tabel yang ingin Anda susun ulang kolomnya.
  • klik 'Desain'.
  • Seret kolom ke urutan yang Anda inginkan.
  • terakhir, klik simpan.

Studio Manajemen SQLServer akan menghapus tabel dan membuatnya kembali menggunakan data.

Tim Connolly
sumber
6

Anda dapat melakukannya dengan membuat tabel baru, menyalin semua data, menjatuhkan tabel lama, lalu mengganti nama yang baru untuk menggantikan yang lama.

Anda juga dapat menambahkan kolom baru ke tabel, menyalin data kolom demi kolom, melepaskan kolom lama, lalu mengganti nama kolom baru agar sesuai dengan yang lama. Contoh sederhana di bawah ini: 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
komma8.komma1
sumber
1
saya menulis prosedur tersimpan yang melakukan sesuatu yang serupa. Ini mengotomatiskan tabel yang dibangun kembali menggunakan SQL dinamis. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer
6

Di SQLServer Management Studio:

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

Batalkan pilihan Prevent saving changes that require table re-creation.

Sekarang Anda dapat menyusun ulang tabel.

Vikas Chaturvedi
sumber
2

Server Sql secara internal membangun skrip. Ini membuat tabel sementara dengan perubahan baru dan menyalin data dan menjatuhkan tabel saat ini kemudian membuat ulang sisipan tabel dari tabel temp. Saya menemukannya dari opsi "Generate Change script" ssms 2014. Script seperti ini. Dari Sini: Cara mengubah urutan kolom dalam tabel menggunakan query 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
Subhankar
sumber
1

Jika tabel Anda memiliki kolom yang cukup, Anda dapat mencoba ini. Pertama buat tabel baru dengan urutan kolom yang diinginkan.

    create table new as select column1,column2,column3,....columnN from table_name;

Sekarang jatuhkan tabel menggunakan perintah drop

    drop table table_name;

sekarang ganti nama tabel yang baru dibuat ke nama tabel lama Anda.

    rename new to table_name;

sekarang pilih tabel, Anda memiliki kolom Anda diatur ulang seperti yang Anda inginkan sebelumnya.

    select * from table_name;
Hemanth Nukala
sumber
Ini sama dengan membuat tabel baru, menyalin data dari tabel yang ada ke yang baru, menghapus yang lama dan mengganti nama yang baru. Jadi tegasnya, ini tidak mengubah urutan kolom tabel. Karena ini membuat / menyalin dari tabel lama, dibutuhkan waktu untuk tabel besar. Last but not least, sintaks yang diusulkan tidak berfungsi di t-sql.
Jean-François
0

Pada akhirnya, Anda tidak bisa melakukan ini di MS SQL. Saya baru-baru ini membuat tabel saat dalam perjalanan (startup aplikasi) menggunakan Prosedur tersimpan yang membaca dari tabel pencarian. Ketika saya membuat tampilan yang menggabungkan ini dengan tabel lain yang saya buat sebelumnya secara manual (skema yang sama, dengan data), Gagal - hanya karena saya menggunakan '' Pilih * UNION Select * 'untuk tampilan. Pada saat yang sama, jika saya hanya menggunakan yang dibuat melalui prosedur tersimpan, saya berhasil.

Kesimpulannya: Jika ada aplikasi yang bergantung pada urutan kolomnya, itu benar-benar pemrograman yang kurang baik dan pasti akan menimbulkan masalah di kemudian hari. Kolom harus 'terasa' bebas berada di mana saja dan digunakan untuk proses data apa pun (INSERT, UPDATE, SELECT).

Chagbert
sumber
0

Anda dapat mencapainya dengan langkah-langkah ini:

  1. hapus semua kunci asing dan kunci utama dari tabel asli.

  2. ganti nama tabel asli.

  3. menggunakan CTAS buat tabel asli sesuai urutan yang Anda inginkan.

  4. jatuhkan meja lama.

  5. terapkan semua batasan kembali ke tabel asli

Ravichandra Aj
sumber
0

Jika kolom yang akan disusun ulang baru-baru ini dibuat dan kosong, maka kolom tersebut dapat dihapus dan ditambahkan kembali dengan urutan yang benar.

Ini terjadi pada saya, memperluas database secara manual untuk menambahkan fungsionalitas baru, dan saya melewatkan satu kolom, dan ketika saya menambahkannya, urutannya salah.

Setelah tidak menemukan solusi yang memadai di sini, saya hanya mengoreksi tabel menggunakan jenis perintah berikut.

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

Catatan: lakukan ini hanya jika Anda tidak memiliki data di kolom yang Anda lepaskan.

Orang mengatakan bahwa urutan kolom tidak masalah. Saya secara teratur menggunakan SQL Server Management Studio "menghasilkan skrip" untuk membuat versi teks dari skema database. Untuk mengontrol versi secara efektif skrip ini (git) dan membandingkannya (WinMerge), sangat penting bahwa keluaran dari database yang kompatibel adalah sama, dan perbedaan yang disorot adalah perbedaan database asli.

Urutan kolom penting; tetapi hanya untuk beberapa orang, tidak untuk semua orang!

Ivan
sumber
0

Saya kira Anda ingin menambahkan kolom baru di posisi tertentu. Anda dapat membuat kolom baru dengan memindahkan kolom saat ini ke kanan.

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

Hapus semua indeks yang terpengaruh dan referensi kunci asing. Tambahkan kolom baru dengan tipe data yang sama persis seperti kolom terakhir dan salin data di sana.

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

Ubah tipe data dari kolom ketiga ke tipe yang sama seperti kolom sebelumnya dan salin data di sana.

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

Ubah nama kolom sesuai, buat ulang indeks yang dihapus dan referensi kunci asing.

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

Ubah tipe data kolom kedua.

Perlu diingat bahwa urutan kolom hanyalah hal "kosmetik" seperti yang dikatakan oleh marc_s .

Václav Dajbych
sumber
-1

Menggunakan

SELECT * FROM TABLE1

yang menampilkan urutan kolom default dari tabel.

Jika Anda ingin mengubah urutan kolom.

Tentukan nama kolom yang akan ditampilkan

SELECT COLUMN1, COLUMN5, COLUMN4, COLUMN3, COULMN2 FROM TABLE1
solairaja
sumber
Pertanyaannya bukan tentang pemesanan sementara. Pertanyaannya adalah tentang struktur desain tabel ketika Anda mengubah tabel dan menambahkan kolom baru.
Vikas Chaturvedi
-1

Anda dapat menggunakan pengindeksan .. Setelah pengindeksan, jika pilih * dari XXXX hasil harus sesuai indeks, Tapi hanya set hasil .. bukan struktur Tabel

Karthik.M
sumber
-1

Anda dapat mengubahnya menggunakan kueri SQL. Berikut adalah sql query untuk mengubah urutan kolom.

ALTER TABLE table name 
CHANGE COLUMN `column1` `column1` INT(11) NOT NULL COMMENT '' AFTER `column2`;
Aashay Shah
sumber
Saya ingin tahu apakah ini turun dan membuat ulang tabel seperti di SSMS. Either way saya tidak akan melempar dadu melakukan ini pada DB produksi, meskipun metode ini tampaknya menarik dan layak untuk dilihat.
samis
Fungsionalitas ini tidak berfungsi di SQL Server seperti yang ditentukan oleh OP. Berharap itu terjadi.
Tagihan
1
Ini adalah sintaks MySQL, bukan SQL Server.
Jon Schneider
-1

Untuk mendapatkan urutan kolom tertentu Anda perlu memilih kolom demi kolom dalam urutan yang Anda inginkan. Urutan pemilihan menentukan bagaimana kolom akan diurutkan dalam keluaran.

Nauris Krūmiņš
sumber
-1

Coba perintah ini:

alter table students modify age int(5) first; 

Ini akan mengubah posisi usia ke posisi pertama.

Mwavu Rogers
sumber
Ini bukan SQL yang valid di MSSQL. Mungkin MySQL atau dialek lain, tetapi tidak untuk SQL Server 2005
nsimeonov
-2

mengubah nama tabel memodifikasi nama kolom int (5) pertama; akan membawa kolom pertama mengubah nama tabel memodifikasi nama kolom int (5) setelah (tablename);

farhan sait
sumber
-3

Contoh: Ubah posisi field_priority setelah field_price dalam status tabel.

ALTER TABLE `status` CHANGE `priority` `priority` INT(11) NULL DEFAULT NULL AFTER `price`;
lecaoquochung
sumber
2
Ini adalah sintaks MySQL, bukan SQL Server.
Jon Schneider