轉自:http://blog.163.com/wex660@126/blog/static/241530652008111411389746/
今天朋友碰到這個問題,好像說過很多遍了,那就發布出來以免每次都說。
一、現象
一般出現這種現象都是適用sql檔案在查詢分析器裡建庫的時候,現象一般都是提示:
"警告: 已建立表 'XXXX,但其最大行大小(89960)超過了每行的最大位元組數(8060)。如果結果行長度超過 8060 位元組,則此表中行的 INSERT 或 UPDATE 將失敗。"
已建立表 'xxxx',但其最大行大小(10438)超過了每行的最大位元組數(8060)。如果結果行長度超過 8060 位元組,則此表中行的 INSERT 或 UPDATE 將失敗。 其中xxxx是你的建的表名,10438是你建表語句中可變長度列(如 nvarchar 或 varbinary)的總長度,8060是SQL Server對行長度的最大限制。
二、原因
其實把上面三個概念搞清楚,警告的原因就應該清楚了,就是因為你的建表語句中可變長度列的總長度超過了SQL Server對行最大長度的限制8060。如果每一行中資料的總長度不超過8060 位元組,就仍可以向表中插入行。但是如果資料超過8060 位元組,因此系統提示你就會出現插入或更新操作失敗。
錯誤提示:
伺服器:資訊 511,層級 16,狀態 1,第 5 行
無法建立大小為 的行,該值大於允許的最大值 8060。
語句已終止。 舉個例子:比如我總共有10塊錢,買A東西可能花1-5塊,買B東西可能花2-3塊,買C東西可能花3-6塊,那我在做預算的時候就要提醒自己,如果ABC三個東西都要花上限的錢,那我的錢可就不夠了,因為5+3+6=14 >10,雖然可能我只花了1+2+3=6塊錢就把ABC全買了。
三、解決
知道問題的原因了,解決辦法相對就簡單了!
1、修改你建表語句中相應的列的資料類型或長度(如將nvarchar格式改成text),讓可變長度列的加和小於8060。這樣可以徹底避免出現上述錯誤發生,當然上述的錯誤並不是必然出現。
2、在絕大多數情況下不會出現各列長度超過行限制的時候(這個需要根據儲存的資料的情況自行判斷),你也可以忽略這個提示,這並不會必然影響到你正常的操作。
四、SQL Server資料詳解
bit 資料類型是整型,其值只能是0、1或空值。這種資料類型用於儲存只有兩種可能值的資料,如Yes 或No、True 或False、On 或
int 資料類型可以儲存從到之間的整數。儲存到資料庫的幾乎所有數值型的資料都可以用這種資料類型。這種資料類型在資料庫裡佔用4個位元組
smallint 資料類型可以儲存從到之間的整數。這種資料類型對儲存一些常限定在特定範圍內的數值型資料非常有用。這種資料類型在資料庫裡佔用2 位元組空間
tinyint 資料類型能儲存從0到255 之間的整數。它在你只打算儲存有限數目的數值時很有用。 這種資料類型在資料庫中佔用1 個位元組
decimal 資料類型能用來儲存從到的固定精度和範圍的數值型資料。使用這種資料類型時,必須指定範圍和精度。 範圍是小數點左右所能儲存的數位總位元。精度是小數點右邊儲存的數位位元
money 資料類型用來表示錢和貨幣值。這種資料類型能儲存從-9220億到9220 億之間的資料,精確到貨幣單位的萬分之一
smallmoney 資料類型用來表示錢和貨幣值。這種資料類型能儲存從-214748.3648 到214748.3647 之間的資料,精確到貨幣單位的萬分之一
float 資料類型是一種近似數實值型別,供浮點數使用。說浮點數是近似的,是因為在其範圍內不是所有的數都能精確表示。浮點數可以是從-1.79E+308到1.79E+308 之間的任意數
real 資料類型像浮點數一樣,是近似數實值型別。它可以表示數值在-3.40E+38到3.40E+38之間的浮點數
datetime資料類型用來表示日期和時間。這種資料類型儲存從到9999年12月3 1日間所有的日期和時間資料, 精確到三百分之一秒或3.33毫秒
smalldatetime 資料類型用來表示從到間的日期和時間,精確到一分鐘
cursor 資料類型是一種特殊的資料類型,它包含一個對遊標的引用。這種資料類型用在預存程序中,而且建立表時不能用
timestamp 資料類型是一種特殊的資料類型,用來建立一個資料庫範圍內的唯一數位。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。儘管它的名字中有“time”, 但timestamp列不是人們可識別的日期。在一個資料庫裡,timestamp值是唯一的
Uniqueidentifier資料類型用來儲存一個通用唯一識別碼,即GUID。GUID確實是全域唯一的。這個數幾乎沒有機會在另一個系統中被重建。可以使用NEWID 函數或轉換一個字串為唯一識別碼來初始化具有唯一識別碼的列
char資料類型用來儲存指定長度的定長非統一編碼型的資料。當定義一列為此類型時,你必須指定列長。當你總能知道要儲存的資料的長度時,此資料類型很有用。例如,當你按郵遞區號加4個字元格式設定來儲存資料時,你知道總要用到108000 個字元
varchar資料類型,同charchar 型不一樣,此資料類型為變長。當定義一列為該資料類型時,你要指定該列的最大長度。 它與char資料類型最大的區別是,儲存的長度不是列長,而是資料的長度
text 資料類型用來儲存大量的非統一編碼型字元資料。這種資料類型最多可以有或20億個字元
nchar 資料類型用來儲存定長統一編碼字元型資料。統一編碼用雙位元組結構來儲存每個字元,而不是用單位元組(普通文本中的情況)。它允許大量的擴充字元。此資料類型能儲存4000種字元,使用的位元組空間上增加了一倍
nvarchar 資料類型用作變長的統一編碼字元型資料。此資料類型能儲存4000種字元,使用的位元組空間增加了一倍
ntext 資料類型用來儲存大量的統一編碼字元型資料。這種資料類型能儲存或將近10億個字元,且使用的位元組空間增加了一倍
binary資料類型用來儲存可達8000 位元組長的定長的位元據。當輸入表的內容接近相同的長度時,你應該使用這種資料類型
varbinary 資料類型用來儲存可達8000 位元組長的變長的位元據。當輸入表的內容大小可變時,你應該使用這種資料類型
image 資料類型用來儲存變長的位元據,最大可達或大約20億位元組
五、SQL Server引用的各種對象的最大值
下表說明在 Microsoft SQL Server 資料庫中定義的,或在 Transact-SQL 陳述式中引用的各種對象的最大值(數量或大小)。下表不包含 Microsoft SQL Server 2000 Windows CE 版。
每個 SQL Server 執行個體的鎖數2,147,483,647(或可用記憶體)2,147,483,647(或可用記憶體) 1、網路資料包大小是表格格式資料方案 (TDS) 資料包的大小,該資料包用於應用程式和關聯式資料庫引擎之間的通訊。預設的資料包大小為 4 KB,由 network packet size 配置選項控制。
2、在 SQL Server 2000 中,任何鍵的最大位元組數不能超過 900。可以使用可變長度的列來定義鍵,只要在這種列中不插入資料超過 900 位元組的行,其最大大小就可以在 900 以上。有關更多資訊,請參見索引鍵的最大值。
3、當使用 SQL Server 2000 Desktop Engine 或 Microsoft 資料引擎 (MSDE) 1.0 時,資料庫的大小不能超過 2 GB。
4、資料庫物件包括所有的表、視圖、預存程序、擴充預存程序、觸發器、規則、預設值及約束。一個資料庫中所有對象的總數不得超過 2,147,483,647。
六、其它
其他關於處理器、記憶體等的限制自己去搜吧。