1

由于“遗留”原因,我们的许多数据varchar与使用的编码一起存储在标准列中。

我正在处理一个批量上传例程,我想在其中将一个 xml 字符串传递给一个存储过程(来自 C#)。xml 字符串将全部采用 unicode 格式,每个元素都具有指示所需目标编码的属性(例如,用于日语的 Shift-JIS)。

SQL Server 中是否有一些内置机制可以在 Transact-SQL 中进行这种转换?

4

3 回答 3

1

将数据存储为 UNICODE。还将所需的“编码”存储为另一列。在您的应用程序中返回数据 (UNICODE) 和所需的编码。将 Unicode 数据转换为它所属的表示层中所需的编码。

于 2012-06-26T11:18:59.983 回答
0
CAST(field AS varchar) [COLLATE][1] your collision
于 2012-06-26T11:03:13.373 回答
0

NVARCHAR如果您只是从 XML 中提取数据并将其用作目标数据类型,您应该能够完成此操作。如果在列上正确指定了排序规则(并且它必须是为了让您没有数据丢失),那么它应该转换为正确的代码页:

DECLARE @SourceXML XML = N'
<Test>
  <Row>
    <Something Collation="Hebrew_100_CI_AS">בליפ</Something>
  </Row>
  <Row>
    <Something Collation="Japanese_XJIS_100_CI_AS">如抜範浪偃壅國&lt;/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

由于 werbeH 引起的从右到左与从左到右的显示问题,结果第 1 行位于两行;-)

第 1 行的“HebrewColumnBytes”值为 4 是正确的,因为希伯来语_*排序规则使用代码页 1255,它是一个单字节字符集。同样,第 2 行的“JapaneseColumnBytes”值 14 是正确的,因为Japanese_*排序规则使用的是双字节字符集的代码页 932。

于 2016-05-02T15:25:56.853 回答