Bir tablodaki sütunları mantıksal olarak yeniden sıralayabilir miyim?


93

Microsoft SQL Server'da bir tabloya sütun ekliyorsam, sütunun sorgularda mantıksal olarak nerede görüntüleneceğini kontrol edebilir miyim?

Diskteki sütunların fiziksel düzenini karıştırmak istemiyorum, ancak SQL Server Management Studio gibi araçların tablonun içeriğini uygun bir şekilde listelemesi için mümkün olduğunda sütunları mantıksal olarak gruplamak istiyorum.

Bunu SQL Management Studio aracılığıyla tablolar için "tasarım" moduna girip sütunların sırasını sürükleyerek yapabileceğimi biliyorum, ancak sıralamayı yapabilmek için bunu ham SQL'de yapabilmek istiyorum. komut satırından yazılmış.


Cevap için çok geç ama bu bağlantıya bir göz atın. blog.sqlauthority.com/2013/03/11/…
sqluser



ve bunun önemli olup olmadığı ile ilgili başka bir ilgili soru stackoverflow.com/questions/6692021/…
Tim Abell

microsoft connect: sütun sırasını değiştirmek için ALTER TABLE sözdizimi - yanıt, her zamanki gibi çikolata-çaydanlık çeşididir WONTFIX
Tim Abell

Yanıtlar:


78

Bunu yeni bir tablo oluşturmadan programlı olarak (yani güvenli bir şekilde) yapamazsınız.

Bir yeniden sıralama taahhüt ettiğinizde Enterprise Manager'ın yaptığı şey, yeni bir tablo oluşturmak, verileri taşımak ve ardından eski tabloyu silmek ve yeni tabloyu mevcut adla yeniden adlandırmaktır.

Sütunlarınızın fiziksel sıralarını değiştirmeden belirli bir sırada / gruplamada olmasını istiyorsanız, istediğiniz her şeyi olabilecek bir görünüm oluşturabilirsiniz.


43

Bence buradaki herkesin eksik olduğu şey şu ki, herkes ülke ve dünya genelinde kurulu aynı yazılım sisteminin 10'lu, 20'li veya 1000'li örnekleriyle uğraşmak zorunda olmasa da ... ticari olarak satılan yazılımları tasarlayan bizler bunu yapıyoruz. Sonuç olarak, zaman içinde sistemleri genişletiriz, yeni yetenekler gerektiğinde alanlar ekleyerek tabloları genişletiriz ve bu alanlar tanımlandıkça mevcut bir tabloya aittir ve bu nedenle, on yıldan fazla bir süredir genişleyen, büyüyen, alan ekleme vb. tablolara ... ve sonra bu tablolarla tasarımdan desteğe, bazen ham verileri araştırmaya / yeni işlevsellik hatalarının hatalarını gidermek için sorun gidermeye kadar çalışmak zorunda kalmak ... istediğiniz birincil bilgilere sahip olmamak inanılmaz derecede can sıkıcı ilk bir avuç tarlada görmek,

Sık sık tam da bu nedenle bunu yapabilmeyi dilemiştim. Ancak tam olarak SQL'in yaptığı şeyi yapmaktan, istediğim gibi yeni bir Tablo için Komut Dosyası Oluşturmak, Ekle'yi yazmak, ardından mevcut tablodan tüm mevcut kısıtlamaları, ilişkileri, anahtarları, dizini vb. Kaldırıp yeniden adlandırmak "yeni" tablo eski isme geri döner ve sonra tüm bu anahtarları, ilişkileri, dizini vb. okur ...

Bu sadece can sıkıcı, zaman alıcı değil, aynı zamanda ... beş yıl sonra tekrar olması gerekecek ....

Bu muazzam miktarda çalışmaya çok yakın, ancak asıl mesele şu ki ... bu yeteneğe en son ihtiyacımız olmayacak, çünkü sistemlerimiz büyümeye, genişlemeye ve tarlaları tarafından yönlendirilen çılgın bir şekilde devam edecek. ihtiyaç / tasarım ilaveleri.

Geliştiricilerin çoğu, tek bir şirkete veya çok özel bir hard box pazarına hizmet eden tek bir sistem bakış açısından düşünüyor.

"Hazır" ancak önemli ölçüde ilerici tasarımcılar ve pazar alanlarındaki gelişim liderleri, her zaman bu problemle tekrar tekrar uğraşmak zorunda kalacaklar ..... herhangi biri varsa yaratıcı bir çözüme bayılacaklar. Bu, şirketime haftada bir düzine saat kazandırabilir, sadece sayfayı kaydırmak zorunda kalmadan veya "o" alanın kaynak veri tablosunda nerede olduğunu hatırlamadan ...


Aynı sorunu yaşadık ve bu işlemi otomatikleştiren bir saklı yordam oluşturduk (yeniden adlandırma, yeni tablo oluşturma, kopyalama, tüm yabancı anahtarları yeniden oluşturma, kısıtlamalar vb.). Yalnızca tablo adını ve sütunların yeni sırasını iletmeniz gerekir. Bu aslında şirketinize haftada onlarca saat kazandırabilirse, benzer bir senaryo yazmaya zaman harcamalısınız. Bizim için, sütunları yeniden sıralamak için rutin olarak kullandığımız kararlı bir komut dosyasına sahip olmak yalnızca 2-3 gün sürdü. SqlServer'da kullandığımız tüm özelliklerle ilgilenir (örn. Kısmi dizinler, dizinlenmiş görünümler, vb.) Ve yalnızca yaklaşık 400 LOC'den oluşur.
Andreas

1
Neden bir şekilde sütun düzenini soyutlayamadıklarını bilmiyorum. Sütunları fiziksel olarak yeniden düzenlemek zorunda değil! Sql Server'daki PHD seviyesi ve mühendislik ötesinde miktarı gerçekten şaşırtıcı. Sorgu planı oluşturmanın karmaşıklığını düşündüğünüzde, istatistikler, indeksleme ve kimse henüz ayağa kalkmadı ve 'Sadece MANTIK sırasını temsil eden bir tablo yapalım. FieldID Guid, OrderBy int. Bitti. Daha sonra SSMS veya bunu SELECT *kullanır. Mükemmel bir DBA iseniz ve istemiyorsanız kapatın. Çok sinir bozucu. Ve şimdi masalarım, artık onu zorlayamayacağım kadar büyük.
Simon_Weaver

Bunun eski bir yorum olduğunu biliyorum, ancak veritabanı projesindeki görsel stüdyo, tablonun şemasını değiştirip yayınlamaya bastığınızda fiziksel sütun yeniden sıralaması için otomatik olarak SQL komut dosyası oluşturur.
Muflix

5

Sorunuzu anlarsam, mevcut sorgularda hangi sütunların birinci, ikinci, üçüncü vb. Döndürüleceğini etkilemek istersiniz , değil mi?

Tüm sorgularınız ile yazılmışsa SELECT * FROM TABLE- SQL'de düzenlendiği gibi çıktıda görüneceklerdir.

Sorgularınız ile yazılmışsa SELECT Field1, Field2 FROM TABLE- SQL'de sıralanma sırası önemli değildir.


3

Management Studio bunu yaptığında, geçici bir tablo oluşturuyor, her şeyi kopyalıyor, orijinal tablonuzu bırakıyor ve geçici tabloyu yeniden adlandırıyor. Basit bir eşdeğer T-SQL ifadesi yoktur.

Bunu yapmaktan hoşlanmıyorsanız, istediğiniz sırayla sütunlarla tablonun bir görünümünü her zaman oluşturabilir ve kullanabilirsiniz?

Düzenleme: dövüldü!


1

Bir yol var, ancak bu yalnızca geçici olarak sorgunun kendisi içindir. Örneğin,

Diyelim ki 5 tablonuz var. Tablo denirT_Testing

FirstName, LastName, PhoneNumber, Email ve Member_ID

Kimliklerini, ardından Soyadını, ardından Adını, ardından Telefon ve E-posta'yı listelemesini istiyorsunuz.

Seçime göre yapabilirsiniz.

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

Bunun dışında, herhangi bir nedenle Soyadının adın önünde gösterilmesini istiyorsanız, bunu aşağıdaki şekilde de yapabilirsiniz:

Select LastName, *
From T_Testing

Yaptığınızdan emin olmak istediğiniz tek şey, Where veya OrderBy kullanacaksanız OrderBy veya Where Fonksiyonunun Table.Column olarak belirtilmesi gerektiğidir.

Misal:

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

Umarım bu yardımcı olur, çözdüm çünkü bunu kendim yapmam gerekiyordu.


Bu sorguda LastName Seçin, * T_Testing'den LastName'i iki kez alırsınız.
sqluser

1
  1. Mevcut tablonuzu bir sorgu penceresine kodlayın.
  2. Bu komut dosyasını bir Test veritabanında çalıştırın (Use ifadesini kaldırın)
  3. İhtiyaç duyduğunuz sütun değişikliklerini yapmak için SSMS kullanın
  4. Değişiklik Komut Dosyası Oluştur'a tıklayın (varsayılan olarak düğme çubuğunda en soldaki ve en alttaki simge)
  5. Bu betiği gerçek masanıza karşı kullanın

Komut dosyasının gerçekten yaptığı tek şey, istenen sütun sıralarıyla ikinci bir tablo tablosu oluşturmak, tüm verilerinizi ona kopyalamak, orijinal tabloyu bırakmak ve ardından ikincil tabloyu yerini alacak şekilde yeniden adlandırmaktır. Bu, bir dağıtım betiği istiyorsanız, kendiniz yazmanızı sağlar.



0

Tablonun tamamını yeniden oluşturmadan sütunların sırasını değiştirmek mümkün değildir. Veritabanının yalnızca birkaç örneğine sahipseniz, bunun için SSMS'yi kullanabilirsiniz (Tabloyu seçin ve "tasarla" yı tıklayın).

Manuel bir işlem için çok fazla örneğiniz varsa, şu komut dosyasını denemelisiniz: https://github.com/Epaminaidos/reorder-columns

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.