「レガシー」の理由により、多くのデータは、varchar
使用されるエンコーディングとともに標準の列にエンコードされて保存されます。
xml文字列を(C#から)ストアドプロシージャに渡したい一括アップロードルーチンに取り組んでいます。xml文字列はすべてUnicodeであり、各要素には目的のターゲットエンコーディングを示す属性があります(日本語の場合はShift-JISなど)。
Transact-SQLでこの種の変換を行うためのSQLServerに組み込まれたメカニズムはありますか?
「レガシー」の理由により、多くのデータは、varchar
使用されるエンコーディングとともに標準の列にエンコードされて保存されます。
xml文字列を(C#から)ストアドプロシージャに渡したい一括アップロードルーチンに取り組んでいます。xml文字列はすべてUnicodeであり、各要素には目的のターゲットエンコーディングを示す属性があります(日本語の場合はShift-JISなど)。
Transact-SQLでこの種の変換を行うためのSQLServerに組み込まれたメカニズムはありますか?
データをUNICODEとして保存します。目的の「エンコーディング」も別の列として保存します。データ(UNICODE)とアプリケーションの目的のエンコーディングの両方を返します。Unicodeデータを、それが属するプレゼンテーション層で目的のエンコーディングに変換します。
CAST(field AS varchar) [COLLATE][1] your collision
NVARCHAR
宛先データ型として使用してXMLからデータを抽出するだけで、これを実現できるはずです。照合が列で適切に指定されている場合(データが失われないようにするためには、照合が必要です)、適切なコードページに変換する必要があります。
DECLARE @SourceXML XML = N'
<Test>
<Row>
<Something Collation="Hebrew_100_CI_AS">בליפ</Something>
</Row>
<Row>
<Something Collation="Japanese_XJIS_100_CI_AS">如抜範浪偃壅國</Something>
</Row>
</Test>'; -- the @Collation attribute is not necessary; only there for visual indication
DECLARE @Test TABLE
(
HebrewCollation VARCHAR(20) COLLATE Hebrew_100_CI_AS,
Latin1Collation VARCHAR(20) COLLATE Latin1_General_100_CI_AS,
JapaneseCollation VARCHAR(20) COLLATE Japanese_XJIS_100_CI_AS
);
INSERT INTO @Test ([HebrewCollation], [Latin1Collation], [JapaneseCollation])
SELECT tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)'),
tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)'),
tab.col.value('(./Something/text())[1]', 'NVARCHAR(100)')
FROM @SourceXML.nodes(N'/Test/Row') tab(col);
SELECT *,
DATALENGTH([HebrewCollation]) AS [HebrewColumnBytes],
DATALENGTH([JapaneseCollation]) AS [JapaneseColumnBytes]
FROM @Test;
戻り値:
HebrewCollation Latin1Collation JapaneseCollation HebrewColumnBytes JapaneseColumnBytes
בליפ
???? ???? 4 4
??????? ??????? 如抜範浪偃壅國 7 14
結果の行1は、werbeHによって引き起こされた右から左への表示と左から右への表示の問題のために2行になっています;-)
行1の「HebrewColumnBytes」値4は、Hebrew_*照合がシングルバイト文字セットであるコードページ1255を使用するため正しいです。同様に、行2の「JapaneseColumnBytes」値14は、Japanese_*照合で2バイト文字セットであるコードページ932を使用するため正しいです。