剛剛才考慮是否天天寫!不過,是該繼續努力做下去了。不然,渾渾噩噩過日子不好了,上有老下有小的。再說,寫寫文章長長記性!提高提高自己!:)
好了,不廢話了!剛才查查郵件,收到了sqlservercentral.com的Newsletter。這期裡面有個問題:
declare @str varchar(max) select @str = replicate('#',10000) + replicate(cast('#' as varchar(max)),8000)+ '#' + '#' + '#' select len(@str)The output of the above code in SQL Server 2005 is:A. 16003B. 18005C. 8000D. Error: Incorrect syntax near '.
可能不怎麼用過varchar這個資料類型,更加是不清楚varchar(max)的情況。結果,我選的答案是C,不過 Sorry - you were wrong。
我的理解是varchar在SQL Server 2005中的長度只有8000 bytes,最多也就8000 bytes了。所以就選了C,一個錯誤的答案。
原來,varchar在varchar(max)的時候,最大能容下2,147,483,648 bytes,這是在SQL Server 2005中的情況。而在Oracle 9i,varchar只有 4000 bytes。在MySql,有65,535 bytes。
因此,那答案會不會是B呢?不,B也是錯誤的。也不會是D,至少那些SQL Statement不會出錯。
正確答案是A。
原因是:replicate這個函數雖然可以按照你的想法把指定的字元(串)複製一定的次數,但不是無限的,在沒有指定字元(串)的資料類型為varchar(max)或nvarchar(max)的情況下,replicate只會得到一個8000 bytes的值,多出都會自動截斷。
這樣,第一個replicate('#',10000) 只能得到 8000 個 '#' ;而第二個有把 '#' 顯式轉換為varchar(max),但由於指定了 8000 ,因此也只有 8000 個 '#' 。
再加上後面 3 個 '#' ,最後的 len 函數的結果也就是 16003 了。
雖然這個問題的目的是replicate函數,但同時varchar也在裡面,也有varchar(max)。