我对计算sql server中记录的最大可能大小感到有些困惑。当我将一个int列添加到我正在处理的应用程序中的表(我没有创建/我不熟悉的表)时,我收到此错误:
Warning: The table "myTable" has been created, but its maximum row size exceeds the allowed maximum of 8060 bytes. INSERT or UPDATE to this table will fail if the resulting row exceeds the size limit.
我已尝试使用建议here的方法来确定表格中的最大记录大小,但结果却截然不同:
1)
SELECT sum(max_record_size_in_bytes) as maxSizeSum
FROM sys.dm_db_index_physical_stats (DB_ID(N'MyDb'), OBJECT_ID(N'[dbo].[myTable]'), NULL, NULL , 'DETAILED')
这返回5712作为maxSizeSum,所以如果这是正确的,那么我在添加字段时得到的错误就必须是错误的......
2)
dbcc showcontig ('myTable') with tableresults
这得到了3976,鉴于帖子中的评论只测量当前数据而不是可能的数据,这并不令人惊讶
3)
SELECT OBJECT_NAME (id) tablename
, COUNT (1) nr_columns
, SUM (length) maxrowlength
FROM syscolumns
GROUP BY OBJECT_NAME (id)
ORDER BY OBJECT_NAME (id)
myTable返回的行的最大长度为52498.我猜这是可能的,但它的WAAAAY高于允许的长度和其他测量方法。
4)This post有另一种方法,也有52498,所以我倾向于认为这是真正的'回答,但我希望得到意见分歧的确认:
Select schema_name(T.schema_id) As SchemaName,
T.Name As TableName,
Sum(C.max_length) As RowSize
From sys.tables T
Inner Join sys.columns C
ON T.object_id = C.Object_ID
INNER JOIN sys.types S
On C.system_type_id = S.system_type_Id
Where T.Name = 'myTable'
Group By schema_name(T.schema_id),
T.Name
Order By schema_name(T.schema_id),
T.Name
我的数据库中没有任何nvarchar字段,所以这对我来说并不重要。最后2种方法是正确的,其他方法是错误的吗?
非常感谢!!
答案 0 :(得分:0)
评论最有说服力。
您超过最大记录大小。根据列的定义,您的表可能超过最大记录大小。
正如您已经证明了查看实际数据大小一样,您的操作似乎是安全的 - 暂时。