कुछ भी करने से पहले, कृपया प्रश्न पर टिप्पणी में @RDFozz द्वारा प्रस्तुत प्रश्नों पर विचार करें:
क्या इस तालिका को आबाद करने के अलावा कोई अन्य स्रोत हैं [Q].[G]
?
यदि प्रतिक्रिया "मैं 100% निश्चित हूं कि इस गंतव्य तालिका के लिए डेटा का एकमात्र स्रोत है" के बाहर कुछ भी है , तो कोई भी परिवर्तन न करें, भले ही वर्तमान में तालिका में डेटा को बिना परिवर्तित किया जा सके या नहीं। डेटा हानि।
क्या निकट भविष्य में इस डेटा को आबाद करने के लिए अतिरिक्त स्रोतों को जोड़ने से संबंधित कोई योजना / चर्चा है?
और मैं एक संबंधित प्रश्न जोड़ूंगा: क्या वर्तमान स्रोत तालिका (यानी [Q].[G]
) में इसे परिवर्तित करके कई भाषाओं का समर्थन करने के आसपास कोई चर्चा हुई है NVARCHAR
?
आपको इन संभावनाओं के बारे में जानने के लिए चारों ओर से पूछना होगा। मुझे लगता है कि आपको वर्तमान में ऐसा कुछ भी नहीं बताया गया है जो इस दिशा में इंगित करेगा अन्यथा आप यह प्रश्न नहीं पूछेंगे, लेकिन यदि इन प्रश्नों को "नहीं" माना गया है, तो उन्हें पूछे जाने की आवश्यकता है, और एक के बारे में पूछा सबसे सटीक / पूर्ण उत्तर पाने के लिए व्यापक-पर्याप्त दर्शक।
यहाँ मुख्य मुद्दा यूनिकोड कोड पॉइंट्स का इतना अधिक नहीं होना है जो (कभी भी) परिवर्तित नहीं हो सकता है , लेकिन अधिक कोड पॉइंट्स हैं जो सभी एक ही कोड पेज पर फिट नहीं होंगे। यूनिकोड के बारे में यह अच्छी बात है: यह सभी कोड पृष्ठों से वर्ण पकड़ सकता है। यदि आप इससे कनवर्ट करते हैं NVARCHAR
- जहां आपको कोड पृष्ठों के बारे में चिंता करने की आवश्यकता नहीं है - VARCHAR
तो, आपको यह सुनिश्चित करने की आवश्यकता होगी कि गंतव्य कॉलम का Collation स्रोत कोड के समान कोड पेज का उपयोग कर रहा है। यह मान लेता है कि एक ही कोड पृष्ठ का उपयोग करके एक स्रोत या कई स्रोत हैं (आवश्यक रूप से समान Collation, हालांकि नहीं)। लेकिन यदि कई कोड पृष्ठ वाले कई स्रोत हैं, तो आप संभावित रूप से निम्नलिखित समस्या में भाग ले सकते हैं:
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;
रिटर्न (दूसरा परिणाम सेट):
ID SourceSlovak SourceHebrew Destination DestinationS DestinationH
1 Ţ ú NULL Ţ ú Ţ ú ? ?
2 NULL ט ת ? ? ט ת ט ת
जैसा कि आप देख सकते हैं, उन सभी वर्णों को परिवर्तित कर सकते हैंVARCHAR
, बस एक ही VARCHAR
कॉलम में नहीं ।
अपनी स्रोत तालिका के प्रत्येक स्तंभ के लिए कोड पृष्ठ क्या है, यह निर्धारित करने के लिए निम्नलिखित क्वेरी का उपयोग करें:
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';
ऐसा कहे जाने के बाद....
आपने SQL Server 2008 R2, BUT पर होने का उल्लेख किया है, आपने यह नहीं कहा कि क्या संस्करण है। यदि आप एंटरप्राइज़ संस्करण पर होते हैं, तो इस सभी रूपांतरण सामग्री के बारे में भूल जाएं (क्योंकि आप संभवतः अंतरिक्ष को बचाने के लिए ऐसा कर रहे हैं), और डेटा संपीड़न सक्षम करें:
यूनिकोड संपीड़न कार्यान्वयन
यदि मानक संस्करण का उपयोग कर (और अब ऐसा लगता है कि आप then हैं) तो एक और loooong- शॉट संभावना है: SQL Server 2016 में अपग्रेड करें क्योंकि SP1 में डेटा संपीड़न का उपयोग करने के लिए सभी संस्करणों की क्षमता शामिल है (याद रखें, मैंने कहा था "लंबे समय तक शॉट "😉)।
बेशक, अब जब यह स्पष्ट कर दिया गया है कि डेटा के लिए केवल एक स्रोत है, तो आपको चिंता करने की कोई ज़रूरत नहीं है क्योंकि स्रोत में कोई यूनिकोड-केवल वर्ण या इसके विशिष्ट कोड के बाहर वर्ण नहीं हो सकते हैं। पृष्ठ। जिस स्थिति में, केवल एक चीज जिसे आपको ध्यान रखने की आवश्यकता है, वह स्रोत कॉलम के समान Collation का उपयोग कर रहा है, या कम से कम एक ही कोड पृष्ठ का उपयोग कर रहा है। मतलब, यदि स्रोत स्तंभ उपयोग कर रहा है SQL_Latin1_General_CP1_CI_AS
, तो आप Latin1_General_100_CI_AS
गंतव्य पर उपयोग कर सकते हैं।
एक बार जब आप जानते हैं कि क्या उपयोग करने के लिए Collation, आप या तो कर सकते हैं:
ALTER TABLE ... ALTER COLUMN ...
होना VARCHAR
(वर्तमान NULL
/ NOT NULL
सेटिंग निर्दिष्ट करना सुनिश्चित करें ), जिसके लिए 87 मिलियन पंक्तियों के लिए थोड़े समय और लेन-देन लॉग स्थान की आवश्यकता होती है।
प्रत्येक के लिए नए "ColumnName_tmp" कॉलम बनाएं और धीरे-धीरे UPDATE
करने के माध्यम से पॉप्युलेट करें TOP (1000) ... WHERE new_column IS NULL
। एक बार जब सभी पंक्तियाँ पॉप्युलेट हो जाती हैं (और यह सत्यापित किया जाता है कि वे सभी सही ढंग से कॉपी किए गए हैं! तो आपको स्पष्ट लेनदेन में, UPDATEs को संभालने के लिए ट्रिगर की आवश्यकता हो सकती है), एक स्पष्ट लेनदेन में, sp_rename
"वर्तमान" कॉलम के कॉलम नामों को स्वैप करने के लिए "होना" _Old "और फिर नए" _tmp "कॉलम को नामों से" _tmp "को हटाने के लिए। फिर sp_reconfigure
टेबल पर संदर्भित किसी भी कैश्ड प्लान को अमान्य करने के लिए टेबल पर कॉल करें , और यदि कोई भी व्यू टेबल को संदर्भित करता है तो आपको कॉल करना होगा sp_refreshview
(या ऐसा कुछ)। एक बार जब आप ऐप को वेरिफाई कर लेते हैं और ईटीएल इसके साथ सही तरीके से काम कर रहा है, तो आप कॉलम को छोड़ सकते हैं।
[G]
ETLed है[P]
। यदि[G]
हैvarchar
, और ETL प्रक्रिया एकमात्र तरीका है, जिसमें डेटा आता है[P]
, तब तक जब तक कि प्रक्रिया सही यूनिकोड वर्ण नहीं जोड़ती है, कोई भी नहीं होना चाहिए। यदि अन्य प्रक्रियाएं डेटा को जोड़ या संशोधित करती हैं[P]
, तो आपको अधिक सावधान रहने की आवश्यकता है - सिर्फ इसलिए कि सभी वर्तमान डेटा काvarchar
मतलब यहnvarchar
नहीं हो सकता है कि डेटा कल नहीं जोड़ा जा सकता है। इसी तरह, यह संभव है कि जो कुछ भी डेटा का उपभोग कर रहा है उसे डेटा की[P]
आवश्यकता होnvarchar
।