Veri kaybetmeden SQL veritabanındaki sütun veri türünü değiştirme


198

Ben SQL Server veritabanı ve ben sadece gelen sütunlardan birinin türünü değiştirebilirsiniz fark intetmek bool.

Bu tabloya girilmiş olan verileri kaybetmeden bunu nasıl yapabilirim?


3
Yeni bir bit sütunu oluşturmayı, değerleri eski sütundan yenisine kopyalamayı, eskisini silmeyi ve yenisini yeniden adlandırmayı denediniz mi? Bütün bunlar bir işlemde, elbette, problemleri geri almak için.
Radu Caprescu

2
"Sütunu bir int'ten boole değiştirebileceğimi fark ettim" diyorsunuz. Boole veri tipi yok. Gerçi biraz var. Nasıl soruyorsun sen (2 cevaplar şu ana kadar örtülü var gibi) yapabilirsiniz. Veya "Bu mümkün olduğunu fark ettim - SQL Server bunu nasıl yapar ?"
Martin Smith

Yanıtlar:


329

Aşağıdaki komutu kullanarak bunu kolayca yapabilirsiniz. 0'ın herhangi bir değeri 0'a (BIT = yanlış), diğer her şey 1'e (BIT = doğru) dönüştürülür.

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

Diğer seçenek, yeni bir tür sütun oluşturmak BIT, eski sütundan doldurmaktır ve işiniz bittiğinde eski sütunu bırakın ve yenisini eski isimle yeniden adlandırın. Bu şekilde, dönüşüm sırasında bir şeyler ters giderse, yine de tüm verilere sahip olduğunuz için her zaman geri dönebilirsiniz.


10
Başka bir deyişle: NULLkalır NULL, 0olur False, sıfır olmayan değerler (1, -1, 1999, -987 ...) olur True.
Álvaro González

2
Ve GUI'den asla böyle bir değişiklik yapmayın. Her zaman böyle bir komut dosyası aracılığıyla yapın. GUI masayı düşürecek ve yeniden oluşturacak ve bu çok daha fazla zaman alıcı. Masa büyük ve üretimde ise, bu felaket olabilir. Ayrıca tüm tablo değişikliklerinin, diğer tüm kodlar gibi kaynak kontrolünde olan bir betiği olmalıdır.
HLGEM

1
Ekleyeceğim, veri içeren bir tabloya herhangi bir yapısal değişiklik yapmadan önce veritabanının güncel bir yedeğine sahip olduğunuzdan emin olun. Ve tablonun sık veya büyük olması durumunda, yoğun kullanım saatlerinde üretimde böyle bir değişiklik yapmayın.
HLGEM

Düzenlemeleri yanlış bir şekilde onayladım ... reddetmem gerekiyor .. çünkü orada iyileştirmeler yok ... Ans mükemmel.
Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Not: sütun boyutu varsa, boyutu da yazmanız yeterlidir.


20

Geçerli bir değişiklikse.

özelliği değiştirebilirsiniz.

Araçlar -> Seçenekler -> Tasarımcılar -> Tablo ve Veritabanı tasarımcıları -> İşaretini kaldır -> Tablonun yeniden oluşturulmasını gerektiren değişiklikleri kaydetmeyi önle.

Artık tabloyu yeniden oluşturmadan veya ur kayıtlarınızı kaybetmeden sütun adını kolayca değiştirebilirsiniz.


5
Hiçbir koşulda GUI kullanarak tablo değişiklikleri yapmamalısınız. Alter tablosunu kullanmak yerine tabloyu tamamen yeniden oluşturur ve bunun işaretini kaldırırsanız ve tablo büyükse bu bir soruna neden olur. Ayrıca, kaynak denetiminde bir komut dosyasında tablolarda tüm değişikliklerin olması gerekir.
HLGEM

Bu seçeneğe daha yakından bakın - GUI'nin masayı düşürmesini önleyecek bir güvenliği kapatıyor. Sen olmayacak görünür GUI tablosunu yeniden çünkü, kaybetmek verilere ancak sunucuda bunun kopyalama / damla olacaktır. Yani, tabloda çok fazla veri varsa, çok büyük bir çalışmaya neden olacaktır. Ayrıca, ben düşünüyorum , bu nedenle hesap hareketleri günlüğe doldurun, tek işlemde meydana geldiği (pozitif değil).
JMarsch

1
Sanırım önceki yorumuma biraz açıklama eklemek istiyorum. Bunu sadece geliştirme makinenizde yapıyorsanız, muhtemelen iyidir. Ama bu yöntemi bir üretim veritabanında kullanmanızı tavsiye etmem - özellikle de kritik öneme sahip bir yöntemse.
JMarsch

8

Neden veri kaybedeceğinizi düşünüyorsunuz? Management Studio'ya gidin ve veri türünü değiştirin. Mevcut değer boole (bit) dönüştürülebilirse bunu yapar. Başka bir deyişle, "1" doğru ile eşlenirse ve "0" orijinal alanınızda yanlış ile eşlenirse, iyi olacaksınız.


1
Tabloda verileriniz varsa, bu çalışmaz. Bir sütun türünü değiştirmeye çalıştığınızda, SMS ilk önce tabloyu bırakması gerektiğini iddia eder ... ALTER TABLE ... ALTER COLUMN komutu NULL olmayan alanlar için bile iyi çalışır. Bu yüzden verileri kaybedebileceklerini düşündüler.
Tony O'Hagan

1
@ TonyO'Hagan Bu doğru değil. Uyarıyı kapatabilirsiniz ve mevcut verilerle iyi çalışır. Ayrıca bkz. Stackoverflow.com/questions/2947865/…
Philippe Leybaert

1
Tamam iyi! Bunu bilmiyordum. Sadece sana oy vermeyi denedim (geri) ama cevabını düzenlemediğin sürece SO beni engelliyor. Belki küçük bir değişiklik ve bunu yapabilirim;).
Tony O'Hagan

1
Hiçbir koşulda GUI kullanarak tablo değişiklikleri yapmamalısınız. Alter tablosunu kullanmak yerine tabloyu tamamen yeniden oluşturur ve bunun işaretini kaldırırsanız ve tablo büyükse bu bir soruna neden olur. Ayrıca, kaynak denetiminde bir komut dosyasında tablolarda tüm değişikliklerin olması gerekir.
HLGEM

GUI'yi tablo tasarlamak veya değiştirmek için kullanmak için hiçbir neden ve bunu yapmamak için iyi nedenler yoktur. Diğer sunuculara yayılabilmesi ve kaynak denetiminde oldukları kod gibi işlem görmesi için tüm değişikliklerin komut dosyalarında olması gerekir.
HLGEM

5

T-SQL (MSSQL) kullanıyorsanız; bu komut dosyasını denemelisiniz:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

MySQL kullanıyorsanız; bu komut dosyasını denemelisiniz:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

Oracle kullanıyorsanız; bu komut dosyasını denemelisiniz:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Araç-Seçenek-tasarımcıları-Tablo ve Veritabanı tasarımcılarına gidin ve Kaydetmeyi önle seçeneğinin işaretini kaldırınresim açıklamasını buraya girin


1
Hiçbir koşulda GUI kullanarak tablo değişiklikleri yapmamalısınız. Alter tablosunu kullanmak yerine tabloyu tamamen yeniden oluşturur ve bunun işaretini kaldırırsanız ve tablo büyükse bu bir soruna neden olur. Ayrıca, kaynak denetiminde bir komut dosyasında tablolarda tüm değişikliklerin olması gerekir.
HLGEM

2

Sütun veri türünü kontrol sütunu türüyle değiştirin:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

benim için, sql server 2016'da böyle yapıyorum

* Sütun1 sütununu sütun2 olarak yeniden adlandırmak için

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Sütun türünü dizeden int'e değiştirmek için :( Lütfen verilerin doğru biçimde olduğundan emin olun )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

Kompakt sürümde datetime veri türü için otomatik olarak boyut alacaktır (8), bu nedenle alan boyutunu ayarlamaya ve bu işlem için hata oluşturmaya gerek yoktur ...


-2

Aşağıdaki sorgu ile tablo alanının veri türünü değiştirebilirsiniz: ve ayrıca Oracle DB,

ALTER TABLE table_name
MODIFY column_name datatype;

SQl Sunucusu'nda değil
HLGEM

-4

Veri kaybetmeden veri türünü değiştirin

alter table tablename modify columnn  newdatatype(size);
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.