何かを行う前に、質問に対するコメントで@RDFozzによって提示された質問を検討してください。
このテーブルにデータを入力する以外に他のソースはあり[Q].[G]
ますか?
応答が「これがこの宛先テーブルのデータの唯一のソースであることを100%確信している」以外の場合、現在テーブルにあるデータを変換せずに変換できるかどうかに関係なく、変更を加えないでくださいデータロス。
そこにある任意の近い将来にこのデータを移入するために追加のソースを追加することに関連する計画/議論は?
そして、関連する質問を追加します:現在のソーステーブル(つまり[Q].[G]
)で複数の言語をサポートすることについて、それを変換することで議論がありましたNVARCHAR
か?
これらの可能性の感覚を得るために周りに尋ねる必要があります。現在、この方向を指し示すものは何も言われていないと思います。それ以外の場合は、この質問をすることはないでしょうが、これらの質問が「いいえ」であると仮定されている場合、質問する必要があります。最も正確で完全な回答を得るための幅広い視聴者。
ここでの主な問題は、(決して)変換できない Unicodeコードポイントがあることではなく、すべてが単一のコードページに収まらないコードポイントがあることです。これはUnicodeの良いところです。すべてのコードページの文字を保持できます。NVARCHAR
コードページについて心配する必要がない場所からに変換する場合VARCHAR
、宛先列の照合がソース列と同じコードページを使用していることを確認する必要があります。これは、1つのソース、または同じコードページを使用する複数のソースがあることを前提としています(ただし、必ずしも同じ照合順序である必要はありません)。ただし、複数のコードページを持つ複数のソースがある場合、次の問題が発生する可能性があります。
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;
戻り値(2番目の結果セット):
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上にあると言いましたが、どのエディションとは言いませんでした。エンタープライズエディションを使用している場合は、(スペースを節約するためだけに行っている可能性が高いので)この変換に関するすべてのことを忘れて、データ圧縮を有効にしてください。
Unicode圧縮の実装
Standard Editionを使用している場合(現在はareであると思われます)、もう1つの可能性があります。SP1にはすべてのエディションでデータ圧縮を使用する機能が含まれるため、SQL Server 2016にアップグレードします( 「😉」。
もちろん、データのソースが1つしかないことが明確になったので、ソースにUnicodeのみの文字や特定のコード以外の文字を含めることはできないため、心配する必要はありません。ページ。この場合、注意が必要なのは、ソース列と同じ照合順序を使用すること、または少なくとも同じコードページを使用する照合順序を使用することです。つまり、ソース列がをSQL_Latin1_General_CP1_CI_AS
使用Latin1_General_100_CI_AS
している場合、宛先で使用できます。
使用する照合を特定したら、次のいずれかを実行できます。
ALTER TABLE ... ALTER COLUMN ...
するVARCHAR
(現在の指定するには、必ずNULL
/ NOT NULL
時間のビットおよび87万行のトランザクション・ログ・スペースの多くを必要とし、設定)、OR
それぞれに新しい「ColumnName_tmp」列を作成し、をUPDATE
実行してゆっくりと入力しTOP (1000) ... WHERE new_column IS NULL
ます。すべての行が読み込まれたら(そしてそれらがすべて正しくコピーされたことを検証します!UPDATEを処理するためのトリガーが必要な場合があります)、明示的なトランザクションsp_rename
で、「現在の」列の列名を「 _Old」、次に新しい「_tmp」列を使用して、名前から「_tmp」を削除します。次にsp_reconfigure
、テーブルを呼び出して、テーブルを参照しているキャッシュプランを無効にします。テーブルを参照しているビューがある場合は、呼び出す必要がありますsp_refreshview
(またはそのようなもの)。アプリを検証し、ETLがアプリで正しく動作したら、列を削除できます。
[G]
はにETLされ[P]
ます。場合[G]
でvarchar
、かつETLプロセスはデータがになる唯一の方法である[P]
プロセスが真のUnicode文字を追加しない限り、その後、任意のがあってはなりません。他のプロセスが追加または内のデータを変更した場合[P]
、あなたはもっと注意する必要があります-現在のすべてのデータができるという理由だけでvarchar
、その意味ではありませんnvarchar
データが明日を追加することができませんでした。同様に、データを消費しているものはどれでもデータを[P]
必要とnvarchar
する可能性があります。