2010-06-10 3 views
1

Dans SQL Server 2005Pourquoi RIGHT (@foostr, 0) renvoie NULL lorsque @foostr est varchar (max)?

Si je veux trouver le plus à droite d'un caractère d'une variable varchar (max), pas de problème:

declare @foostr varchar(max) 
set @foostr = 'abcd' 
select right (@foostr, 1) 

---- 
d 

Si je veux trouver les plus à droite zéro caractères d'un littéral de chaîne, pas de problème:

select right ('abcd', 0) 

------------------ 

Il renvoie une chaîne vide.
Si je veux trouver les personnages les plus à droite d'un zéro varchar (10), pas de problème:

declare @foostr varchar(10) 
set @foostr = 'abcd' 
select right (@foostr, 0) 

---- 

Il retourne une chaîne vide.
Si je veux trouver les personnages les plus à droite d'un zéro varchar (max), ainsi:

declare @foostr varchar(max) 
set @foostr = 'abcd' 
select right (@foostr, 0) 

----  
NULL 

Il retourne NULL. Pourquoi?

+0

Je dois vous demander pourquoi vous voulez faire cela? – HLGEM

+1

il suffit d'utiliser: 'ISNULL (right (@foostr, 0), '')' et vous êtes bon pour aller ... –

+0

C'était il ya un certain temps; Je ne me souviens pas exactement - juste pour m'amuser j'essayais d'écrire un string.reverse(), et je parcourais une chaîne et déplaçait des personnages, et à la dernière itération la ligne: set @string = substring (@ string, @index, 1) + left (@string, @index) + right (@string, len (@string) - @index) retourné NULL au lieu de la chaîne finale inversée. Ou quelque chose comme ça. –

Répondre

4

Je pense que c'est un comportement non défini, tel que décrit dans the doc of RIGHT,

integer_expression

est un entier positif qui indique le nombre de caractères de character_expression seront retournés. Si integer_expression est négatif, une erreur est renvoyée.

Il ne précise pas ce qui va revenir si elle est 0.

+2

le doc de DROITE! – Andomar

+0

Cependant, il est assez étrange que NULL soit retourné. Demander 0 caractères devrait vous donner une chaîne de 0 longueur. –

0

, 1 non, 0 mais revient '' pour moi de toute façon

declare @foostr varchar(max) 
set @foostr = 'abcd' 
select right (@foostr, 1) 

pourquoi, 0 ???? qu'est-ce que les caractères les plus à zéro sont supposés vouloir dire?

DROIT (character_expression, integer_expression) integer_expression est un entier positif qui indique le nombre de caractères de character_expression seront retournés. Si integer_expression est négatif, une erreur est renvoyée. Si integer_expression est de type bigint et contient une grande valeur, character_expression doit être d'un grand type de données tel que varchar (max).

Questions connexes