T-SQL替换“西里尔符号”返回'????'

时间:2012-09-17 08:20:37

标签: sql-server-2008 tsql encoding replace

我有一个将CSV列表转换为表格中的nvarchar(max)记录的函数。我注意到它不适用于西里尔语,问题是这里取代:

DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@List, ',', ']]></r><r><![CDATA[') + ']]></r>'

如何使替换与西里尔符号一起使用?例如'тест'。

@List是NVARCHAR(MAX),我正在使用SQL Server 2012。

2 个答案:

答案 0 :(得分:1)

您是否将@List变量定义为nvarchar?替换将适用于nvarchars

declare @list nvarchar(50) = N'те,ст'
select @list
DECLARE @XML xml = N'<r><![CDATA[' + REPLACE(@List, ',', ']]></r><r><![CDATA[') + ']]></r>'

答案 1 :(得分:1)

N''表示法用于声明Unicode字符串文字。如果你定义一个变量NVARCHAR,它会自动启用Unicode(所以不需要(或者更确切地说:没办法)为@variables另外声明N - 它是字符串文字的一部分。)

由于您在SELECT N'тест'中获得了西里尔字符,因此您应该检查变量@List的分配位置以及它的值。

不确定CSV解析器如何处理Unicode字符,但问题的根源可能是

  • 不处理文件编码
  • 在分配给@List
  • 之前分配VARCHAR列或变量