2010-06-10 51 views
1

在SQL Server 2005中爲什麼ROW(@foostr,0)在@foostr爲varchar(max)時返回NULL?

如果我想找到一個varchar(最大)變量的最右側的一個字,沒有問題:

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

---- 
d 

如果我想找到最右邊的零個字符沒有問題:

select right ('abcd', 0) 

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

它返回一個空字符串。
如果我想找到一個varchar(10)的最右邊的零個字符,沒有問題:

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

---- 

它返回一個空字符串。
如果我想找到一個varchar(最大)的最右邊的零個字符,以及:

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

----  
NULL 

返回null。爲什麼?

+0

我要問你爲什麼會想這樣做? – HLGEM 2010-06-10 20:49:34

+1

只是使用:'ISNULL(右(@foostr,0),'')',你很好去... – 2010-06-10 20:55:12

+0

不久前;我不記得確切 - 爲了好玩,我試圖編寫一個string.reverse(),並且我遍歷一個字符串並移動字符,並在最後一行迭代: set @string = substring(@ string,@index,1)+ left(@string,@index)+ right(@string,len(@string) - @index) 返回NULL而不是最終的反轉字符串。或類似的東西。 – 2010-06-10 21:06:26

回答

4

我覺得這是一個不確定的行爲,如the doc of RIGHT描述,

integer_expression

是一個正整數,指定一個character_expression的衆多人物怎麼會被退回。如果integer_expression爲負數,則返回錯誤。

它不指定將返回的內容如果是0

+2

正確的文檔! – Andomar 2010-06-10 21:01:10

+0

不過,返回NULL是很奇怪的。詢問0個字符應該給你一個0長度的字符串。 – 2010-06-11 18:34:19

0

,1不是0,但回報 '' 我反正

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

爲什麼,0 ????什麼是最正確的零字符應該是什麼意思?

RIGHT(一個character_expression,integer_expression) integer_expression 是一個整數,指定一個character_expression的衆多人物怎麼會被退回。如果integer_expression爲負數,則返回錯誤。如果integer_expression的類型是bigint並且包含較大的值,則character_expression必須是大數據類型,例如varchar(max)。