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.
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.
Yanıtlar:
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 TABLE
komutla 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.
INSERT
!
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
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
- 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)
- 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.)
- 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.
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.
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 .
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:
select *
sütunları belirli bir sırayla döndürülmeye zorlamazcreate table' or in the
alter tablosunda `` ifadeler '' ekler.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
- - -
SQLServer Management Studio'da:
Araçlar -> Seçenekler -> Tasarımcılar -> Tablo ve Veritabanı Tasarımcıları
Sonra:
SQLServer Management studio tabloyu bırakacak ve verileri kullanarak yeniden oluşturacaktır.
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
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.
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
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;
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).
Bunu şu adımlarla başarabilirsiniz:
orijinal tablonun tüm yabancı anahtarlarını ve birincil anahtarını kaldırın.
orijinal tabloyu yeniden adlandırın.
CTAS kullanarak orijinal tabloyu istediğiniz sırada oluşturun.
eski masayı bırak.
tüm kısıtlamaları orijinal tabloya geri uygulayın
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!
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 .
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
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`;
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.
Bu komutu deneyin:
alter table students modify age int(5) first;
Bu, yaşın konumunu ilk konuma değiştirecektir.
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);
Ö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`;