本文出處:http://www.cnblogs.com/wy123/p/6217772.html 字元串自身相加, 雖然賦值給了varchar(max)類型的變了,在某些特殊情況下仍然會被“截斷”,這到底是varchar(max)長度的問題還是操作的問題? 1,兩個不超過8000長度的字元串自身相加 ...
本文出處: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)變數之後,用變數相加,因為用變數相加的方式總是會沒有問題的。