2009-12-24 5 views
1

Je dois retourner du texte russe à partir d'une table de base de données SQL Server 2005.Comment renvoyer une valeur Unicode dans cet exemple SQL?

Dans l'exemple suivant, qui est un moyen simple de décrire mon dilemme, la variable @Test affichera des points d'interrogation:

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

(Notez que la valeur @Test est un texte russe, pour ceux qui ne « t ont la police installée)

Mais si je change le code à ce qui suit, la variable @Test imprimera le texte comme prévu.

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

Voici ce que je veux savoir:

Dans mon exemple, dans le monde réel que je fais ce qui suit avec une procédure stockée:

EXEC usp_GetContent @Content = @Test 

La valeur de @Test est en russe, mais s'affiche sous la forme points d'interrogation. Si le proc a ressemblé à ceci, le Russe vient à travers bien:

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

Mais ce n'est pas une possibilité pour moi; Je dois passer dans une variable.

Un conseil?

Merci.

Répondre

0

Tant que le paramètre de procédure stockée est défini comme unicode, tel que nvarchar, et que le code appelant définit explicitement l'objet paramètre de la commande avec le même type, il devrait fonctionner correctement.

Lorsque vous l'avez écrit en SQL, vous avez passé un varchar dans votre premier exemple, donc il ne l'a pas compris.

La question est la ligne:

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

Pas la procédure stockée.

0

Il y a 2 raisons possibles pour lesquelles vous obtenez des points d'interrogation. Soit lorsque vous définissez la variable avant l'appel de proc stocké, vous ne mettez pas un «N». Ou lorsque vous imprimez la sortie, la police résultante ne prend pas en charge les caractères à deux octets.

0

Cette requête:

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

renverra votre page de code par défaut du serveur qui très probablement sera différent de 1251 ou 866.

Lorsque vous utilisez cette constante:

'Баннер' 

, le serveur va essayer de convertir les symboles russes, il obtient sur la connexion en quelque chose de votre codepage.

Mais votre page de code 437 (ou ce que vous avez) ne permet pas cette conversion, c'est pourquoi les caractères sont remplacés par les points d'interrogation.

Questions connexes