2008-10-22 97 views
6

我试图确定表中的字节行长度通过执行以下存储过程:SQL Server行长度

CREATE TABLE #tmp 
(
    [ID] int, 
    Column_name varchar(640), 
    Type varchar(640), 
    Computed varchar(640), 
    Length int, 
    Prec int, 
    Scale int, 
    Nullable varchar(640), 
    TrimTrailingBlanks varchar(640), 
    FixedLenNullInSource varchar(640), 
    Collation varchar(256) 
) 
INSERT INTO #tmp exec sp_help MyTable 
SELECT SUM(Length) FROM #tmp 
DROP TABLE #tmp 

的问题是,我不知道该表的定义(数据类型,等等。)由'sp_help'返回的表格。

我得到以下错误:

Insert Error: Column name or number of supplied values does not match table definition. 

望着sp_help将存储过程并没有给我任何线索。

什么是正确的CREATE TABLE语句插入的sp_help的结果吗?

回答

0

我不能帮你创建一个临时表来存储信息的sp_help,但我可以帮你计算行的长度。看看这个MSDN article;它可以帮助你计算这种基于字段长度,类型等可能不会采取太多把它转换成一个SQL脚本,您可以通过查询系统对象对重复使用等

编辑:

我我正在调整我的建议,为它做一个脚本。我的方式远没有Vendoran那么容易。 :)

顺便说一句,我收回我刚才有关无法帮助临时表说。我可以:你做不到。 sp_help输出七个行集,所以我认为你不能像原始问题中描述的那样执行某些操作。我认为你被困在一个不同的方法来想出它。

7

这是怎么做到的呢?

CREATE TABLE tblShowContig 
(
    ObjectName CHAR (255), 
    ObjectId INT, 
    IndexName CHAR (255), 
    IndexId INT, 
    Lvl INT, 
    CountPages INT, 
    CountRows INT, 
    MinRecSize INT, 
    MaxRecSize INT, 
    AvgRecSize INT, 
    ForRecCount INT, 
    Extents INT, 
    ExtentSwitches INT, 
    AvgFreeBytes INT, 
    AvgPageDensity INT, 
    ScanDensity DECIMAL, 
    BestCount INT, 
    ActualCount INT, 
    LogicalFrag DECIMAL, 
    ExtentFrag DECIMAL 
) 
GO 

INSERT tblShowContig 
EXEC ('DBCC SHOWCONTIG WITH TABLERESULTS') 
GO 

SELECT * from tblShowContig WHERE ObjectName = 'MyTable' 
GO 
2

试试这个:

- 所有列的总长度达

select SUM(sc.length) 
from syscolumns sc 
inner join systypes st on sc.xtype = st.xtype 
where id = object_id('table') 

- 看各种物品返回

select st.name, sc.* 
from syscolumns sc 
inner join systypes st on sc.xtype = st.xtype 
where id = object_id('table') 

无担保虽然,但它似乎与sp_help'table'中出现的长度相同

免责声明: 注意,我读到约翰·鲁迪以及除最大尺寸链接的文章在这里,你还需要其他的东西,如NULL位图来获得实际的行大小。此外,这里的尺寸是最大尺寸。如果你有一个VARCHAR列的实际尺寸小于上最行....

Vendoran有一个很好的解决方案,但我没有看到任何地方(根据表定义)的最大行大小。我确实看到了平均规模和各种分配信息,这些信息正是您估计大部分事务所需的DB大小所需的信息。

如果您有兴趣正是SP_HELP长度和增加它的回报,那么我认为(我不是100%确定),该查询系统对象返回那些相同的数字。它们代表完整的最大行大小吗?不,你错过了像NULL位图这样的东西。它们是否代表您对实际数据的现实衡量?不需要。如果只存储100个字符,则VARCHAR(500)不会占用500个字节。另外,与行分开存储的TEXT字段和其他字段不会显示它们的实际大小,只是指针的大小。

0

这会给你的所有信息,你需要

Select * into #mytables 
from INFORMATION_SCHEMA.columns 

select * from #mytables 

drop table #mytables 

UPDATE:

我给的答案是不完全的不正确。如果您查看返回的数据,您会意识到可以使用大小写来编写查询来计算以字节为单位的行大小。它拥有您所需的全部内容:数据类型|大小|精度。 BOL具有每种数据类型使用的字节。 当我有机会时,我会发布完整的答案。

2

上述答案都不是正确的或有效的。

问题是根据每列的数据类型确定每行消耗的字节数。

的唯一方法,(S)我有工作有:

  1. EXEC sp_help将“MYTABLE” - 然后添加了第二个结果集(Length字段如果从查询分析器或Management Studio中的工作 - 只需将结果复制并粘贴到电子表格中并执行SUM)

  2. 编写一个访问第二个结果集并累计每行的长度字段的C#或VB.NET程序。

  3. 修改sp_help的代码。

由于无法处理多个结果集,因此无法使用Transact SQL和sp_help完成此操作。

FWIW:对结果集的表定义可以在这里找到:

http://msdn.microsoft.com/en-us/library/aa933429(SQL.80).aspx

相关问题