Как вернуть значение Unicode в этом примере SQL? - PullRequest
1 голос
/ 24 декабря 2009

Мне нужно вернуть русский текст из таблицы базы данных 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 на русском языке, но отображается в виде вопросительных знаков. Если проц выглядел так, русский проходит нормально:

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

Но это не возможно для меня; Мне нужно передать переменную.

Любой совет?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 24 декабря 2009

Пока параметр хранимой процедуры определен как юникод, такой как nvarchar, и вызывающий код явно определяет объект параметра команды с таким же типом, он должен работать нормально.

Когда вы написали егов SQL вы передали varchar в своем первом примере, поэтому он не понял его.

Проблема заключается в строке:

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

Не хранимая процедура.

0 голосов
/ 24 декабря 2009

Этот запрос:

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

вернет кодовую страницу вашего сервера по умолчанию, которая, скорее всего, будет отличаться от 1251 или 866.

Когда вы используете эту константу:

'Баннер'

, сервер попытается преобразовать русские символы, которые он получает через соединение, во что-то из вашей кодовой страницы.

Но ваша кодовая страница 437 (или что у вас есть) не допускает этого преобразования, поэтому символы заменяются знаками вопроса.

0 голосов
/ 24 декабря 2009

Есть две возможные причины, по которым вы получаете вопросительные знаки. Либо, когда вы устанавливаете переменную перед сохраненным вызовом proc, вы не ставите 'N'. Или при печати вывода результирующий шрифт не поддерживает двухбайтовые символы.

...