কিছু করার আগে দয়া করে @RDFozz দ্বারা উত্থাপিত প্রশ্নগুলিতে প্রশ্নের একটি মন্তব্যে বিবেচনা করুন, যথা:
এই টেবিলটি পপুলেশন করার পাশাপাশি কি অন্য কোনও উত্স আছে [Q].[G]
?
যদি প্রতিক্রিয়াটি "আমি 100% নিশ্চিত যে এটি এই গন্তব্য সারণীর জন্য ডেটাগুলির একমাত্র উত্স " এর বাইরে কিছু থাকে তবে সারণীতে থাকা ডেটাটি পরিবর্তিত হতে পারে তা নির্বিশেষে কোনও পরিবর্তন করবেন না, তথ্য ক্ষতি
অদূর ভবিষ্যতে এই ডেটা জনপ্রিয় করার জন্য অতিরিক্ত উত্স যুক্ত করার সাথে সম্পর্কিত কোনও পরিকল্পনা / আলোচনা আছে ?
এবং আমি একটি সংশ্লিষ্ট প্রশ্ন যোগ হবে: সেখানে আছে বিদ্যুৎ উৎস টেবিল (অর্থাত মধ্যে একাধিক ভাষা সমর্থন প্রায় কোনো আলোচনা হয়েছে [Q].[G]
রূপান্তর দ্বারা) এটা করার NVARCHAR
?
এই সম্ভাবনাগুলি বোঝার জন্য আপনাকে প্রায় জিজ্ঞাসা করতে হবে। আমি ধরে নিলাম আপনাকে বর্তমানে এমন কিছু বলা হয়নি যা এই দিক নির্দেশ করবে অন্যথায় আপনি এই প্রশ্ন জিজ্ঞাসা করবেন না, তবে এই প্রশ্নগুলি যদি "না" হিসাবে ধরে নেওয়া হয়, তবে তাদের জিজ্ঞাসা করা দরকার এবং একটি জিজ্ঞাসা করা উচিত সর্বাধিক নির্ভুল / সম্পূর্ণ উত্তর পেতে প্রশস্ত শ্রোতা।
এখানে মূল ইস্যুটিতে ইউনিকোড কোড পয়েন্টগুলি এত বেশি নয় যা রূপান্তর করতে পারে না (কখনও), তবে আরও এমন কোড পয়েন্ট রয়েছে যা সমস্ত কোনও একক কোড পৃষ্ঠায় ফিট করে না। এটি ইউনিকোড সম্পর্কে দুর্দান্ত জিনিস: এটি সমস্ত কোড পৃষ্ঠা থেকে অক্ষর ধরে রাখতে পারে। আপনি যদি NVARCHAR
কোথা থেকে কোড পৃষ্ঠা সম্পর্কে চিন্তা করার দরকার নেই - এ থেকে রূপান্তর করেন VARCHAR
তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে গন্তব্য কলামের সমাহারটি উত্স কলাম হিসাবে একই কোড পৃষ্ঠাটি ব্যবহার করছে। এটি ধরে নিয়েছে যে কোনও একটি উত্স, বা একই কোড পৃষ্ঠা ব্যবহার করে একাধিক উত্স রয়েছে (যদিও অগত্যা একই সমষ্টি নয়)। তবে যদি একাধিক কোড পৃষ্ঠাগুলি সহ একাধিক উত্স থাকে তবে আপনি নিম্নলিখিত সমস্যাটিতে সম্ভাব্যরূপে চলতে পারেন:
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';
বলা হচ্ছে যে....
আপনি এসকিউএল সার্ভার ২০০৮ আর ২, বিউটিতে থাকার কথা বলেছেন, তবে সংস্করণটি কী বলেননি। যদি আপনি এন্টারপ্রাইজ সংস্করণে উপস্থিত হয়ে থাকেন তবে এই সমস্ত রূপান্তরকরণের জিনিসটি ভুলে যান (যেহেতু আপনি সম্ভবত এটি কেবল স্থান বাঁচানোর জন্য করছেন), এবং ডেটা সংক্ষেপণ সক্ষম করুন:
ইউনিকোড সংক্ষেপণ বাস্তবায়ন
যদি স্ট্যান্ডার্ড সংস্করণ ব্যবহার করা হয় (এবং এটি এখন মনে হয় যে আপনি then) তবে আরও একটি লুওং-শট সম্ভাবনা রয়েছে: এসকিউএল সার্ভার ২০১ to-তে আপগ্রেড করার কারণে এসপিএল সমস্ত সংস্করণে ডেটা সংক্ষেপণ ব্যবহারের ক্ষমতা অন্তর্ভুক্ত করেছে (মনে রাখবেন, আমি "লং-শট" বলেছিলাম "😉)।
অবশ্যই, এখন এটি কেবল স্পষ্ট করে দেওয়া হয়েছে যে ডেটাগুলির জন্য কেবল একটি উত্স রয়েছে, তবে উত্সটিতে কোনও ইউনিকোড-অক্ষর বা নির্দিষ্ট কোডের বাইরে অক্ষর থাকতে পারে না বলে আপনার উদ্বেগের কিছু নেই since পাতা। সেক্ষেত্রে আপনার উত্সাহের একমাত্র বিষয়টি উত্স কলামের মতো একই কোলেশন ব্যবহার করা বা কমপক্ষে একটি যা একই কোড পৃষ্ঠা ব্যবহার করছে তা ব্যবহার করা। অর্থ, যদি উত্স কলামটি ব্যবহার করে থাকে SQL_Latin1_General_CP1_CI_AS
তবে আপনি Latin1_General_100_CI_AS
গন্তব্যে ব্যবহার করতে পারেন ।
কোলেশন কী ব্যবহার করতে হবে তা একবার আপনি জানতে পারলে আপনিও পারেন:
ALTER TABLE ... ALTER COLUMN ...
হতে VARCHAR
(বর্তমান NULL
/ NOT NULL
সেটিংস নির্দিষ্ট করে দেওয়ার বিষয়ে নিশ্চিত হন ), যার জন্য 87৩ মিলিয়ন সারিগুলির জন্য কিছুটা সময় এবং প্রচুর লেনদেনের লগ স্পেস প্রয়োজন, বা
প্রত্যেকের জন্য নতুন "ColumnName_tmp" কলাম তৈরি করুন এবং ধীরে ধীরে মাধ্যমে পূরণ UPDATE
করছেন TOP (1000) ... WHERE new_column IS NULL
। সমস্ত সারি একবার জনবসতিযুক্ত হয়ে যায় (এবং যাচাই করা হয় যে সেগুলি সমস্তগুলি সঠিকভাবে অনুলিপি করেছে! আপনার আপডেটগুলি হ্যান্ডেল করার জন্য একটি ট্রিগারের প্রয়োজন হতে পারে, যদি থাকে তবে) "স্পষ্ট" লেনদেনে, sp_rename
"বর্তমান" কলামগুলির কলামের নামগুলি অদলবদল করতে ব্যবহার করুন " _ পুরানো "এবং তারপরে নতুন" _tmp "কলামগুলি নামগুলি থেকে কেবল" _tmp "সরাতে। তারপরে sp_reconfigure
সারণীটি উল্লেখ করে কোনও ক্যাশেড পরিকল্পনা অকার্যকর করতে টেবিলের উপর কল করুন এবং সারণীতে রেফারেন্সিংয়ের কোনও মতামত থাকলে আপনাকে কল করতে হবে sp_refreshview
(বা এর মতো কিছু)। একবার আপনি অ্যাপ্লিকেশনটি যাচাই করে নিলে এবং ইটিএল এটির সাথে সঠিকভাবে কাজ করছে, তারপরে আপনি কলামগুলি বাদ দিতে পারেন।
[G]
ইটিএলড হয়ে গেছে[P]
। যদি[G]
হয়varchar
, এবং ETL প্রক্রিয়াটি কেবলমাত্র ডাটাতে আসে[P]
, তবে প্রক্রিয়াটি সত্যিকারের ইউনিকোড অক্ষর যুক্ত না করা পর্যন্ত কোনও কিছু হওয়া উচিত নয়। যদি অন্যান্য প্রক্রিয়াগুলিতে ডেটা যুক্ত করে বা সংশোধন করে তবে[P]
আপনার আরও সতর্ক হওয়া দরকার - কেবলমাত্র বর্তমান সমস্ত ডেটা এরvarchar
অর্থ এই নয় যেnvarchar
আগামীকাল ডেটা যুক্ত করা যায়নি। একইভাবে, এটি সম্ভব যে যা কিছু ডেটা গ্রাহ্য করে তাদের ডেটা[P]
প্রয়োজনnvarchar
।