Bir şey yapmadan önce, lütfen @RDFozz tarafından sorulan bir soruya, yani:
Var mıdır herhangi yanında başka kaynaklar [Q].[G]
bu tabloyu doldurma?
Yanıt " Bu hedef tablo için tek veri kaynağı olduğundan% 100 eminim" dışında bir şeyse, o anda tablodaki verilerin olmadan dönüştürülüp dönüştürülemeyeceğine bakılmaksızın herhangi bir değişiklik yapmayın veri kaybı.
Bu verileri yakın gelecekte doldurmak için ek kaynaklar eklemeyle ilgili herhangi bir plan / tartışma var mı?
Ve İlgili bir soru eklemek istiyorum: orada Has been akım kaynağı tablosundaki (yani birden çok dili destekleyen etrafında herhangi bir tartışmanın [Q].[G]
dönüştürerek) bunu hiç NVARCHAR
?
Bu olasılıkları anlamak için etrafta sormanız gerekecek. Sanırım şu anda bu yönde başka bir şeye işaret etmeyeceğiniz söylenmemiştir, ancak bu soruyu sormazsınız, ancak bu soruların "hayır" olduğu varsayılırsa, o zaman sorulmaları ve bir soru sormaları gerekir. en doğru / eksiksiz cevabı almak için yeterince geniş kitle.
Buradaki ana sorun, dönüştürülemeyen (hiç) Unicode kod noktalarına sahip olmak değil , daha çok hepsi tek bir kod sayfasına sığmayacak kod noktalarına sahip olmaktır. Unicode hakkında güzel bir şey var: TÜM kod sayfalarındaki karakterleri tutabilir. NVARCHAR
- kod sayfaları hakkında endişelenmenize gerek olmayan bir yerden - dönüştürürseniz VARCHAR
, hedef sütunun Harmanlaması'nın kaynak sütununla aynı kod sayfasını kullandığından emin olmanız gerekir. Bu, aynı kod sayfasını kullanan bir kaynağa veya birden çok kaynağa sahip olduğunu varsayar (yine de aynı Harmanlama değil). Ancak, birden çok kod sayfası olan birden fazla kaynak varsa, aşağıdaki sorunla karşılaşabilirsiniz:
DECLARE @Reporting TABLE
(
ID INT IDENTITY(1, 1) PRIMARY KEY,
SourceSlovak VARCHAR(50) COLLATE Slovak_CI_AS,
SourceHebrew VARCHAR(50) COLLATE Hebrew_CI_AS,
Destination NVARCHAR(50) COLLATE Latin1_General_CI_AS,
DestinationS VARCHAR(50) COLLATE Slovak_CI_AS,
DestinationH VARCHAR(50) COLLATE Hebrew_CI_AS
);
INSERT INTO @Reporting ([SourceSlovak]) VALUES (0xDE20FA);
INSERT INTO @Reporting ([SourceHebrew]) VALUES (0xE820FA);
UPDATE @Reporting
SET [Destination] = [SourceSlovak]
WHERE [SourceSlovak] IS NOT NULL;
UPDATE @Reporting
SET [Destination] = [SourceHebrew]
WHERE [SourceHebrew] IS NOT NULL;
SELECT * FROM @Reporting;
UPDATE @Reporting
SET [DestinationS] = [Destination],
[DestinationH] = [Destination]
SELECT * FROM @Reporting;
İade (2. sonuç kümesi):
ID SourceSlovak SourceHebrew Destination DestinationS DestinationH
1 Ţ ú NULL Ţ ú Ţ ú ? ?
2 NULL ט ת ? ? ט ת ט ת
Gördüğünüz gibi, tüm bu karakterler aynı sütunda değil , dönüştürülebilir .VARCHAR
VARCHAR
Kaynak tablonuzun her sütunu için kod sayfasının ne olduğunu belirlemek için aşağıdaki sorguyu kullanın:
SELECT OBJECT_NAME(sc.[object_id]) AS [TableName],
COLLATIONPROPERTY(sc.[collation_name], 'CodePage') AS [CodePage],
sc.*
FROM sys.columns sc
WHERE OBJECT_NAME(sc.[object_id]) = N'source_table_name';
SÖYLENİYOR Kİ....
SQL Server 2008 R2'de olmaktan bahsettiniz, ANCAK, hangi Sürümü söylemediniz. Enterprise Edition'daysanız, tüm bu dönüşüm şeylerini unutun (çünkü sadece yer kazanmak için yapıyorsunuz) ve Veri Sıkıştırmayı etkinleştirin:
Unicode Sıkıştırma Uygulaması
Standard Edition kullanıyorsanız (ve şimdi 😞 gibi görünüyor) o zaman başka bir looooong-shot olasılığı var: SP1, tüm sürümlerin Veri Sıkıştırma kullanma yeteneğini içerdiğinden (hatırlayın, "uzun çekim" dedim) "😉).
Tabii ki, şimdi veriler için sadece bir kaynak olduğu açıklığa kavuşturuldu, o zaman endişelenecek bir şeyiniz yok, çünkü kaynak sadece Unicode karakterleri veya özel kodunun dışındaki karakterler içeremedi sayfa. Bu durumda, dikkat etmeniz gereken tek şey, kaynak sütunla aynı Harmanlamayı veya aynı Kod Sayfasını kullanan en az birini kullanmaktır. Yani, kaynak sütun kullanıyorsa SQL_Latin1_General_CP1_CI_AS
, Latin1_General_100_CI_AS
hedefte kullanabilirsiniz .
Hangi Harmanlamayı kullanacağınızı öğrendikten sonra:
ALTER TABLE ... ALTER COLUMN ...
olmak VARCHAR
(geçerli belirtmek emin olun NULL
/ NOT NULL
biraz zaman 87 milyon satır için işlem günlük çok yer gerektirir ayar) VEYA
Her biri için yeni "ColumnName_tmp" sütunları oluşturun ve UPDATE
yaparak yavaşça doldurun TOP (1000) ... WHERE new_column IS NULL
. Tüm satırlar doldurulduktan (ve hepsinin doğru bir şekilde kopyalandığını doğruladıktan sonra! Varsa UPDATE'leri işlemek için bir tetikleyiciye ihtiyacınız olabilir), açık bir işlemde, sp_rename
"geçerli" sütunların sütun adlarını " _Old "ve ardından yeni" _tmp "sütunlarını basitçe adlardan" _tmp "kaldırmak için. Ardından sp_reconfigure
, tabloya başvuran önbelleğe alınmış planları geçersiz kılmak için tabloyu arayın ve tabloya referans veren herhangi bir Görünüm varsa aramanız gerekir sp_refreshview
(veya bunun gibi bir şey). Uygulamayı doğruladıktan ve ETL onunla doğru bir şekilde çalıştıktan sonra sütunları bırakabilirsiniz.
[G]
, adresine aktarılır[P]
. Eğer[G]
birvarchar
ve ETL işlem veri girer tek yolu[P]
, süreç gerçek Unicode karakterleri ekler sonra sürece, herhangi olmamalıdır. Diğer işlemler veri ekler veya değiştirirse[P]
, daha dikkatli olmanız gerekir - sadece mevcut verilerin olabilmesivarchar
,nvarchar
yarın verilerin eklenemeyeceği anlamına gelmez . Benzer şekilde,[P]
ihtiyaçnvarchar
verilerinde veri tüketen her şeyin veri olması da mümkündür .