在这个SQL示例中,如何返回Unicode值?

在这个SQL示例中,如何返回Unicode值?,sql,stored-procedures,unicode,parameters,Sql,Stored Procedures,Unicode,Parameters,我需要从SQLServer2005数据库表返回俄语文本 在下面的示例中,@Test变量将打印出问号,这是描述我的困境的一种简单方法: DECLARE @Test nvarchar(max) SET @Test = 'Баннер' PRINT @Test 请注意,@Test值是俄文文本,适用于未安装字体的用户 但如果我将代码更改为以下内容,@Test变量将按预期打印文本: DECLARE @Test nvarchar(max) SET @Test = N'Баннер' PRINT @Test

我需要从SQLServer2005数据库表返回俄语文本

在下面的示例中,@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的值是俄语的,但显示为问号。如果程序是这样的,俄罗斯人会很好地通过:

EXEC usp_GetContent @Content = N'Баннер'
但这对我来说是不可能的;我需要传入一个变量

有什么建议吗


谢谢。

有两个可能的原因让你得到了问号。在存储过程调用之前设置变量时,没有输入“N”。或者,在打印输出时,生成的字体不支持双字节字符。

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

当您用SQL编写它时,您在第一个示例中传递了一个varchar,所以它没有理解它

问题在于:

SET @Test = 'Баннер'
不是存储过程。

此查询:

SELECT  COLLATIONPROPERTY(CAST(SERVERPROPERTY('Collation') AS NVARCHAR), 'CodePage')
将返回服务器的默认代码页,该代码页很可能与1251或866不同

使用此常量时:

'Баннер'
,服务器将尝试将通过连接获得的俄文符号转换为代码页中的内容

但是您的代码页437或您拥有的任何东西不允许这种转换,这就是为什么字符被替换为问号的原因