本文出處:http://www.cnblogs.com/wy123/p/6217772.html
字符串自身相加, 雖然賦值給了varchar(max)類型的變量,在某些特殊情況下仍然會被“截斷”,這到底是varchar(max)長度的問題還是操作的問題?
1,兩個不超過8000長度的字符串自身相加,其結果長度超過8000之后會被截斷:
不多說,直接上例子:定義一個字符串,賦值給 varchar(max)類型的變了,字符創長度為4040沒有,任何問題。
把4040長度的字符串復制一份出來,也就是將兩個4040長度的字符串“相加”
發現最后的結果是8000,為什么?肯定是被截斷了,因為select @strSQL出來的字符串少了一部分。
varchar(max)定義的沒問題,相加也沒問題,那么為什么就被截斷?
補充測試:此種情況下,用concat相加效果也一樣(會被截斷)
2,兩個字符串賦值給varchar(max)類型變量,用變量1+變量2的方式相加,其結果長度超過8000之后不會被截斷:
上面問題先不回答,換一種操作方式看看結果
將連個字符串先分別賦值給兩個varchar(max)的變量,將兩個變量相加,賦值給一個varchar(max)的變量,看看最后變量相加的結果
我想大概有答案了:
1,兩個不超過8000長度的“字符串自身”相加,相加之后默認總長度是不超過8000的,超過8000的部分會被截斷
2,將字符串賦值給varchar(max)變量之后,用“變量相加”的方式相加,賦值給一個varchar(max),其結果是不會被截斷的
3,兩個相加的字符串中有一個長度超過了8000,相加之后不會被截斷:
另外還有一種情況,假如第一個字符串長度超過了8000,加一個任一長度的字符串(不管超不超過8000),最后的結果呢?
再次做一下論證,試一試就知道了。
此時第1個字符串長度超過了8000,第2個無所謂超不超過8000,那么相加之后,計算其LEN,最終的結果是沒有被截斷的。
補充測試:不截圖了,此種情況下,用concat相加也沒有問題(不會被截斷)
4,兩個相加的字符串中有一個長度超過了8000,分別賦值給變量,相加之后不會被截斷:
最終的結論有三個
1,兩個不超過8000長度的“字符串自身”相加,相加之后默認總長度是不超過8000的,如果相加之后的長度超過8000,超過8000的部分會被截斷
2,相加的兩個字符串中有一個長度超過了8000,相加兩個字符串本身之后的結果是不會被截斷的。
3,不管字符串長度如何,將字符串賦值給varchar(max)變量之后,用“變量相加”的方式相加,賦值給第三個varchar(max)變量,其結果是不會被截斷的
所以:當無法預計相加的兩個字符串本身的長度是多少,以及相加之后的長度是多少的時候,
請不要直接對兩個字符串本身進行相加(+)操作,為了確保萬無一失,請將字符串賦值給varchar(max)變量之后,用變量相加,因為用變量相加的方式總是會沒有問題的。
補充:以上測試是以非Unicode字符為例的
當字符串為Unicode字符型的時候(Unicode字符為兩個字節,非Unicode字符為1個字節),8000這個數值也要除以2,也即4000