本文出處:http://www.cnblogs.com/wy123/p/6709520.html 1,SQL語句或者存儲過程的最大長度(SQL字元串容量)是多少? 經常有人問,我的SQL語句是拼湊出來的,可能很長,如果太長了,是不是SQL Server支持不動了? SQL語句的或者存儲過程的最大長度 ...
本文出處:http://www.cnblogs.com/wy123/p/6709520.html
1,SQL語句或者存儲過程的最大長度(SQL字元串容量)是多少?
經常有人問,我的SQL語句是拼湊出來的,可能很長,如果太長了,是不是SQL Server支持不動了?
SQL語句的或者存儲過程的最大長度是65,536 * Network packet size,那麼這個Network packet size是個什麼鬼?
參考如下截圖,是網路包的大小,預設是4096個位元組,也就是4kb,
那麼預設情況下,SQL語句的最大長度就是65,536 * 4kb = 255.996093MB,接近256MB了,
因此正常情況下,可以不用顧忌“我的SQL語句太長了,是不是要撐爆SQL Server了”,但這並不代表我就支持以字元串的形式拼湊出來一個很長的SQL語句的做法。
上述配置也可以從配置表中查詢
2,Print 關鍵字可以列印出來的字元串或者變數的最大位元組數是8000
print關鍵字在print字元串的時候,可以列印出來的字元串的最大長度是8000個位元組,如果字元串或者變數的長度超過8000個位元組,會被截斷,
這裡的8000是位元組數,而不是字元數,如果字元串是UNICODE字元,那麼列印出來的字元的個數將會是4000,包括肉眼看不到的回車換行。
因為有人在調試存儲過程的時候,發現print出來的東西跟預期的不一致,也不要覺得奇怪!
如截圖,原始字元串的每行都是一樣長的,print出來就被截斷了,原因就在這裡
3,SELECT語句查詢時候,顯示在SSMS表格中的最大字元長度
這個長度的預設設置時65535,也就是說如果是varchar(max)或者nvarchar(max),結果超出65535個位元組的,顯示的結果是會被截斷的,
但這並不證明查詢結果是錯誤的,僅僅是沒有將結果完全顯示在SSMS的表格中而已。
如果有長欄位,在複製查詢結果的時候要小心,直接複製很有可能複製的是一個殘缺的結果。
不過測試的時候,倒是跟這裡的65535有一點差異。
4,varchar(max)和nvarchar(max)最大支持多大的存儲容量
varchar(max)和nvarchar(max)的最大存儲容量都是2^31-1和位元組,也就是差一個位元組夠2GB,
一本純文本的TXT電子書才多大,因此大多數情況下不用顧忌說我存儲的字元串很長,varchar(max)到底行不行。
但是nvarchar(max)存儲的字元的最大個數要比varchar(max)少一倍,因為nvarchar(max)一個字元占兩個位元組。要弄清楚存儲對象的編碼類型。
測試驗證一下最大存儲容量的問題
5,CTE遞歸過程中支持的最大遞歸次數
預設情況下最大遞歸次數是100,可以最大強制遞歸到32767次
在預設情況下,比如如下的SQL遞歸99次,執行起來是沒有問題的
如下的SQL語句執行之後就會報錯,超出了預設遞歸的最大次數
如下是通過OPTION (MAXRECURSION 32767)的方式強制遞歸到最大的32767次
6,SQL Server資料庫中時間類型欄位的範圍
與數值型的類型類似,時間類型也一樣,每種類型都有一定的範圍,不是任意一個類型的變數都可以隨便賦值的。
操作時間類型數據的時候,一不小心就出錯了,原因是不同的時間類型有不同的取值範圍,範圍不對的時候也會out-of-range錯誤
各種時間類型的取值範圍以及占用的空間如下
至於同一種類型,占用空間不同的原因是表示的精度不一樣的時候,占用的空間不一樣
想起來再補充