如何在此SQL示例中返回Unicode值?

时间:2009-12-24 16:24:37

标签: sql stored-procedures unicode parameters

我需要从SQL Server 2005数据库表中返回俄语文本。

在以下示例中,这是一种描述我的困境的简单方法,@ Test变量将打印出问号:

DECLARE @Test nvarchar(max)
SET @Test = 'Баннер'
PRINT @Test

(注意@Test值是俄语文本,适用于没有安装字体的人。)

但如果我将代码更改为以下内容,@ Test变量将按预期打印出文本:

DECLARE @Test nvarchar(max)
SET @Test = N'Баннер'
PRINT @Test

以下是我想知道的事项:

在我的实际示例中,我使用存储过程执行以下操作:

EXEC usp_GetContent @Content = @Test

@Test的值是俄语,但会显示为问号。如果proc看起来像这样,那么俄罗斯就可以了:

EXEC usp_GetContent @Content = N'Баннер'

但这不是我的可能;我需要传入一个变量。

有什么建议吗?

感谢。

3 个答案:

答案 0 :(得分:0)

有两个可能的原因,你得到问号。当您在存储的proc调用之前设置变量时,您没有放置'N'。或者,当您打印输出时,结果字体不支持双字节字符。

答案 1 :(得分:0)

只要将存储过程参数定义为unicode(如nvarchar),并且调用代码显式定义了具有相同类型的命令的参数对象,它就可以正常工作。

当你用SQL编写它时,你已经在第一个例子中传入了一个varchar,所以它还没有理解它。

问题在于:

SET @Test = 'Баннер'

不是存储过程。

答案 2 :(得分:0)

此查询:

SELECT  COLLATIONPROPERTY(CAST(SERVERPROPERTY('Collation') AS NVARCHAR), 'CodePage')

将返回您服务器的默认代码页,该代码页很可能与1251866不同。

使用此常量时:

'Баннер'

,服务器将尝试将通过连接获得的俄语符号转换为代码页中的某些内容。

但您的代码页437(或您拥有的任何内容)不允许进行此转换,这就是字符被问号替换的原因。