Sql server 2005'te sql sorgusu kullanarak bir tablodaki sütun sırası nasıl değiştirilir?


109

SQL Server 2005'te SQL sorgusu kullanarak bir tablodaki sütun sırası nasıl değiştirilir?

SQL sorgusu kullanarak bir tablodaki sütun sırasını yeniden düzenlemek istiyorum.


3
Tabloda var olan sütunların konumunu değiştirmekten bahsediyorsanız , tercih edilen sırayla yeni bir tablo oluşturmanız, eski tablodan verileri eklemeniz ve ardından orijinal tabloyu bırakmanız gerekir. Bunu yapmanın (bildiğim kadarıyla) başka yolu yok.
Michael Todd

Bir SELECT deyimindeki sütun sırasından mı yoksa tablo tanımındaki sütun sırasından mı bahsediyorsunuz?
marc_s

Yanıtlar:


112

Yapamazsın. Sütun sıralaması, biz insanların ilgilendiği "kozmetik" bir şeydir - SQL Server için, neredeyse her zaman kesinlikle alakasızdır.

Sütun sırasını değiştirdiğinizde SQL Server Management Studio'nun arka planda yaptığı şey, tabloyu yeni bir CREATE TABLEkomutla sıfırdan yeniden oluşturmak , eski tablodaki verileri kopyalamak ve sonra bırakmaktır.

Sütun sırasını tanımlayan bir SQL komutu yoktur.


4
Hayır, SQL Server'da böyle bir şey yoktur - ve herhangi bir gerçek RBDMS'de olmamalıdır - sütun sırası bir SQL tablosu ile ilgili bir kavram değildir
marc_s

68
@marc_s Sütun sırasını desteklemenin iyi bir nedeni yok. Sadece görsel olsa bile. Bir "SELECT *" yaptığınızda, belirli bir sütun sırasına sahip bir tablodaki verilere bakmayı kolaylaştırabilir. Ben bir geliştiriciyim ve her zaman bu tür sorgular yapıyorum. Önceden tanımlanmış iyi bir sütun düzeni ile biraz zaman ayırabilirsiniz. Başka herhangi bir bakış açısından, elbette, hiçbir anlamı yoktur: hiçbir şey sütun sırasına bağlı olmamalıdır. Bu arada, "INFORMATION_SCHEMA.COLUMNS" sorgusu yaptığınızda bir ORDINAL_POSITION sütunu q var. Ne anlama geldiğini bilmiyorum ... ama bununla bir ilgisi olmalı.
JotaBe

18
Sütun sırası, örneğin sütun adlarını belirtmeden INSERT INTO kullanıldığında geçerlidir. Başka bir örnek, sütun adı yerine SİPARİŞE GÖRE sütun dizinidir. Her ikisi de açıkça önerilmeyen uygulamalar, ancak SQL Server buna izin veriyor, böylece birileri onu bir yerde kullanmış olabilir, muhtemelen sütun sırasını değiştirirken T-SQL kodunu kırabilir.
Carvellis

12
@Carvelis: Yine de sütunlarınızı açıkça belirtmeden ASLA kullanmamalısınız INSERT!
marc_s

2
@marc_s: kesinlikle, ama genellikle bir proje üzerinde çalışan tek kişi ben değilim. İnsanların bu tür bir kod kullandığı epeyce proje gördüm.
Carvellis

30

Alanları, 'varsayılan' sıra için * kullanmak yerine, döndürülmelerini istediğiniz sırada açıkça listelemelisiniz.

orijinal sorgu:

select * from foobar

İadeler

foo bar
--- ---
  1   2

şimdi yaz

select bar, foo from foobar

bar foo
--- ---
  2   1

Yukarıdaki cevap yanlış değil mi? Bu cevap tam anlamıyla sütunların nasıl sıralanacağını gösterir, neden öncekinde bir onay işareti var ve bu işaret yok?
Ajan Lu

1
@Agent Lu Sorun, asıl sorunun ifadesidir. Marc ve ben, OP'nin 'sütunların sırasını değiştir' sorusunu farklı şekilde yorumladık. Saklanan tabloda sütun sırasının neden alakasız olduğuna dair güçlü bir argüman yapıyor (isimler olsa da). Verilerin farklı bir sütun sırasına göre nasıl çıkarılabileceğini gösterdim. Hiç de aynı şey değil!
lexu

23

http://msdn.microsoft.com/en-us/library/aa337556.aspx'e göre

Bu görev, Transact-SQL ifadeleri kullanılarak desteklenmez.

Peki, komma8.komma1 tarafından cevaplandığı gibi create/ copy / drop/ rename kullanılarak yapılabilir.

Veya SQL Server Management Studio'yu kullanabilirsiniz

  1. In Nesne Explorer , sen reorder istediğiniz sütunlu tabloyu sağ tıklayın ve Tasarım (daha önce ver de Değiştir. 2005 SP1 veya)
  2. Yeniden sıralamak istediğiniz sütun adının solundaki kutuyu seçin. (Klavyenizdeki [shift] veya [ctrl] tuşlarını basılı tutarak birden çok sütun seçebilirsiniz.)
  3. Sütunları tablo içinde başka bir konuma sürükleyin.

Ardından kaydet'i tıklayın. Bu yöntem aslında tabloyu düşürür ve yeniden oluşturur, bu nedenle bazı hatalar meydana gelebilir.

Eğer Değişim İzleme seçeneği veritabanı ve tablo için etkinleştirildiğinde, bu yöntemi kullanmamalıdır.

Devre dışı bırakılırsa, Tablo yeniden oluşturma seçeneği gerektiren değişiklikleri kaydetmeyi önle seçeneği, Araçlar menüsü> Seçenekler> Tasarımcılar'da kaldırılmalıdır, aksi takdirde "Değişiklikleri kaydetmeye izin verilmez" hatası ortaya çıkar.

  • Tablo yeniden oluşturulduğunda mevcut değişiklik izleme bilgilerinin silinmesine yol açacağından, tablonun yeniden oluşturulmasını gerektiren değişiklikleri kaydetmeyi engelle seçeneğinin devre dışı bırakılması Microsoft tarafından şiddetle tavsiye edilir; bu nedenle, Değişiklik İzleme ise bu seçeneği hiçbir zaman devre dışı bırakmamalısınız. etkinleştirildi!

Birincil ve yabancı anahtar oluşturma sırasında da sorunlar ortaya çıkabilir.

Yukarıdaki hatalardan herhangi biri meydana gelirse, kaydetme başarısız olur ve bu da sizi orijinal sütun sırasına bırakır.


1
This task cannot be performed using Transact-SQL statements.Belgedeki " " ifadesi yanlıştı. Yazarı anlattım ve onu " This task is not supported using Transact-SQL statements." olarak değiştirmesini istedim . Yaklaşık bir gün önce yazar kabul etti ve belge düzeltildi. GitHub'da yaptığımız tartışmayı takip edebilirsiniz .
Ronen Ariely

@RonenAriely iyi iş ve bana bildirdiğiniz için teşekkürler. Cevabımı güncelledim
robotik

Çok rica ederim @robotik 😀. Umarım buraya gelip en çok oy alan yanıtı gören herkes bunun tam bir hata olduğunu anlayacaktır. Ne yazık ki, Topluluklar genellikle bir sürü (sığır) gibi davranır ve toplulukta bir lider ve en çok katkıda bulunan (en iyi uzman olarak kabul edilen) bir kez hata yaptığında, bu başlıkta olduğu gibi diğerleri onu takip eder. Zaten çok sayıda oy almışsa insanlar bir hataya oy vermeye devam ederler ("herkes öyle diyorsa, o zaman doğrudur" yaklaşımı) ve foruma gelecek olan diğer insanlar bunun doğru yanıt olduğunu düşüneceklerdir.
Ronen Ariely

1
@RonenAriely bu yüzden her zaman aşağı kaydırıyorum :)
robotik

13

Bu, bir sorgu sonucunda kayıtların sıralanmasıyla ilgili soruya benzer .. ve genellikle kimse resmi olarak doğru yanıtı sevmez ;-)

İşte başlıyor:

  • SQL standardına göre, bir tablodaki sütunlar "sıralı" değildir
  • sonuç olarak bir select * sütunları belirli bir sırayla döndürülmeye zorlamaz
  • tipik olarak, her RDBMS'nin bir tür "varsayılan" sırası vardır (genellikle sütunların tabloya eklenme sırası. create table' or in the alter tablosunda `` ifadeler '' ekler.
  • bu nedenle, sütunların sırasına bağlıysanız (çünkü bir sorgunun sonuçlarını sütunların konumundan başka bir veri yapısını poulatmak için kullandığınız için), sütunları istediğiniz sırayla açıkça listeleyin.

11

Elbette bir sql ifadesindeki sütunların sırasını değiştirebilirsiniz. Ancak, tabloların fiziksel sütun sırasını soyutlamak istiyorsanız, bir görünüm oluşturabilirsiniz. yani

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
-  -  -

bu sorgu zamanını değiştirir mi?
blindguy

@blindguy hayır sorgu zamanınızı değiştirmez
mevdiven

9

SQLServer Management Studio'da:

Araçlar -> Seçenekler -> Tasarımcılar -> Tablo ve Veritabanı Tasarımcıları

  • 'Tablonun yeniden oluşturulmasını gerektiren değişiklikleri kaydetmeyi önle' seçeneğinin işaretini kaldırın.

Sonra:

  • sütunlarını yeniden sıralamak istediğiniz tabloya sağ tıklayın.
  • 'Tasarım'a tıklayın.
  • Sütunları istediğiniz sıraya sürükleyin.
  • son olarak, kaydet'i tıklayın.

SQLServer Management studio tabloyu bırakacak ve verileri kullanarak yeniden oluşturacaktır.


6

Bunu yeni bir tablo oluşturarak, tüm verileri kopyalayarak, eski tabloyu bırakarak ve ardından yenisini eskisinin yerini alacak şekilde yeniden adlandırarak yapabilirsiniz.

Ayrıca tabloya yeni sütunlar ekleyebilir, sütunu sütun verilerinin üzerine kopyalayabilir, eski sütunları bırakabilir ve ardından eski sütunlarla eşleşecek şekilde yeni sütunları yeniden adlandırabilirsiniz. Aşağıdaki basit bir örnek: 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
Benzer bir şey yapan bir saklı yordam yazdım. Dinamik SQL kullanarak tablonun yeniden oluşturulmasını otomatikleştirir. caseyplummer.wordpress.com/2013/07/22/…
Casey Plummer

6

SQLServer Management Studio'da:

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

Seçimi kaldırın Prevent saving changes that require table re-creation.

Şimdi masayı yeniden sıralayabilirsiniz.


2

Sql sunucusu betiği dahili olarak oluşturur. Yeni değişikliklerle geçici bir tablo oluşturur ve verileri kopyalar ve mevcut tabloyu bırakır, ardından tablo ekini geçici tablodan yeniden oluşturur. Bunu "Generate Change script" seçeneği ssms 2014'ten buluyorum. Komut dosyası şöyle. Buradan : Sql sorgusu kullanarak bir tablodaki sütun sırası nasıl değiştirilir

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

Tablonuzda yeterli sütun varsa, bunu deneyebilirsiniz. Önce tercih edilen sütun sırasına sahip yeni bir tablo oluşturun.

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

Şimdi drop komutunu kullanarak tabloyu bırakın

    drop table table_name;

şimdi yeni oluşturulan tabloyu eski tablonuzun adıyla yeniden adlandırın.

    rename new to table_name;

şimdi tabloyu seçin, daha önce tercih ettiğiniz gibi sütunlarınızı yeniden düzenleyin.

    select * from table_name;

Bu, yeni bir tablo oluşturmak, verileri mevcut tablodan yenisine kopyalamak, eskisini silmek ve yenisini yeniden adlandırmakla aynıdır. Yani tam olarak söylemek gerekirse, bu tablonun sütun sırasını değiştirmez. Bu eski tablodan oluşturduğundan / kopyaladığından, büyük tablolar için zaman alır. Son olarak, önerilen sözdizimi t-sql'de çalışmıyor.
Jean-François

0

Günün sonunda, bunu MS SQL'de yapamazsınız. Yakın zamanda, bir arama tablosundan okuyan saklı bir Prosedürü kullanarak hareket halindeyken (uygulama başlangıcı) tablolar oluşturdum. Bunları daha önce manuel olarak oluşturduğum başka bir tabloyla birleştiren bir görünüm oluşturduğumda (aynı şema, verilerle), başarısız oldu - çünkü görünüm için '' Seç * BİRLİĞİ Seç * 'i kullanıyordum. Aynı zamanda, yalnızca saklı yordam aracılığıyla oluşturulanları kullanırsam başarılı olurum.

Sonuç olarak: Sütun sırasına bağlı herhangi bir uygulama varsa, bu gerçekten iyi bir programlama değildir ve kesinlikle ileride problemler yaratacaktır. Sütunlar herhangi bir yerde özgür hissetmeli ve herhangi bir veri işlemi için kullanılmalıdır (INSERT, UPDATE, SELECT).


0

Bunu şu adımlarla başarabilirsiniz:

  1. orijinal tablonun tüm yabancı anahtarlarını ve birincil anahtarını kaldırın.

  2. orijinal tabloyu yeniden adlandırın.

  3. CTAS kullanarak orijinal tabloyu istediğiniz sırada oluşturun.

  4. eski masayı bırak.

  5. tüm kısıtlamaları orijinal tabloya geri uygulayın


0

Yeniden sıralanacak sütunlar yakın zamanda oluşturulmuşsa ve boşsa, sütunlar silinebilir ve doğru sırada yeniden eklenebilir.

Bu, yeni işlevsellik eklemek için bir veritabanını manuel olarak genişleterek başıma geldi ve bir sütunu atlamıştım ve onu eklediğimde sıra yanlıştı.

Burada yeterli bir çözüm bulamadıktan sonra, aşağıdaki tür komutları kullanarak tabloyu düzelttim.

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

Not: Bunu yalnızca bıraktığınız sütunlarda veri yoksa yapın.

İnsanlar sütun sırasının önemli olmadığını söylediler. Veritabanının şemasının metin sürümünü oluşturmak için düzenli olarak SQL Server Management Studio'yu kullanıyorum. Bu komut dosyalarını (git) etkili bir şekilde kontrol etmek ve karşılaştırmak (WinMerge) için, uyumlu veritabanlarının çıktısının aynı olması ve vurgulanan farklılıkların gerçek veritabanı farklılıkları olması zorunludur.

Sütun sırası önemlidir; ama sadece bazılarına, herkese değil!


0

Sanırım belirli bir konuma yeni bir sütun eklemek istiyorsunuz. Mevcut sütunları sağa taşıyarak yeni bir sütun oluşturabilirsiniz.

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

Etkilenen tüm dizinleri ve yabancı anahtar referanslarını kaldırın. Son sütunla aynı veri türüne sahip yeni bir sütun ekleyin ve verileri oraya kopyalayın.

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

Üçüncü sütunun veri türünü önceki sütunla aynı türe değiştirin ve verileri oraya kopyalayın.

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

Sütunları uygun şekilde yeniden adlandırın, kaldırılan dizinleri ve yabancı anahtar referanslarını yeniden oluşturun.

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

İkinci sütunun veri türünü değiştirin.

Sütun sırasının marc_s'in dediği gibi "kozmetik" bir şey olduğunu unutmayın .


-1

Kullanım

SELECT * FROM TABLE1

tablonun varsayılan sütun sırasını görüntüler.

Sütunların sırasını değiştirmek istiyorsanız.

Uygun şekilde görüntülenecek sütun adını belirtin

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

Soru geçici siparişle ilgili değil. Soru, tabloyu değiştirip yeni sütunlar eklediğinizde tablo tasarım yapısıyla ilgilidir.
vikas Chaturvedi

-1

indekslemeyi kullanabilirsiniz .. İndekslemeden sonra, XXXX'ten * seçerseniz, sonuçlar indekse göre olmalıdır, Ancak sadece sonuç kümesi .. Tablonun yapısı değil


-1

Bunu SQL sorgusu kullanarak değiştirebilirsiniz. Sütun sırasını değiştirmek için sql sorgusu burada.

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

Bunun SSMS'deki gibi tabloyu düşürüp yeniden oluşturup oluşturmadığını merak ediyorum. Her iki durumda da bunu bir üretim DB'sinde yapan zarları atmazdım, ancak bu yöntem ilginç görünüyor ve biraz araştırmaya değer.
samis

Bu işlevsellik, OP tarafından belirtildiği gibi SQL Server'da çalışmaz. Keşke olsaydı.
Bill

1
Bu MySQL sözdizimidir, SQL Server değildir.
Jon Schneider

-1

Belirli bir sütun sırasına sahip olmak için istediğiniz sırayla sütun sütun seçmeniz gerekir. Seçim sırası, çıktıda sütunların nasıl sıralanacağını belirler.


-1

Bu komutu deneyin:

alter table students modify age int(5) first; 

Bu, yaşın konumunu ilk konuma değiştirecektir.


Bu MSSQL'de geçerli bir SQL değildir. Belki MySQL veya başka bir lehçe, ancak SQL Server 2005 için değil
nsimeonov

-2

tablo adını değiştir, önce sütun adını değiştir int (5); sütunu ilk olarak tablo adını değiştirmeye getirecek, sütun adını değiştir (5) (tablename);


-3

Örnek: tablo durumundaki field_price'den sonra field_priority konumunu değiştirin.

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

2
Bu MySQL sözdizimidir, SQL Server değildir.
Jon Schneider
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.