T-SQL字符串相加之后被截斷的那點事


 

 

本文出處: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM