SQL Server行长度

时间:2008-10-22 20:33:46

标签: sql-server stored-procedures

我正在尝试通过执行以下存储过程来确定表的行长度:

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存储过程并没有给我任何线索。

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

5 个答案:

答案 0 :(得分: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

答案 1 :(得分: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'中显示的长度相同

声明: 请注意,我阅读了John Rudy链接的文章,除了这里的最大大小之外,还需要其他东西,比如NULL位图来获取实际的行大小。此处的尺寸也是最大尺寸。如果你有一个varchar列,那么大多数行的实际大小都会减少......

Vendoran有一个很好的解决方案,但我没有看到任何地方的最大行大小(基于表定义)。我确实看到了平均大小和各种分配信息,这正是你需要估算大多数事情的数据库大小。

如果您对sp_help返回的长度和添加内容感兴趣,那么我认为(我不是100%肯定)对sysobjects的查询返回相同的数字。它们代表完整的最大行大小吗?不,你错过了像NULL位图这样的东西。它们是否代表了实际数据的实际指标?不会。如果您只存储100个字符,则VARCHAR(500)不会占用500个字节。 TEXT字段和与行分开存储的其他字段也不会显示它们的实际大小,只显示指针的大小。

答案 2 :(得分:2)

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

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

我所做的唯一方法是:

  1. exec sp_help'mytable' - 然后将第二个结果集的Length字段加起来(如果使用查询分析器或Management Studio工作 - 只需将结果复制并粘贴到电子表格中并执行SUM)

  2. 编写一个访问第二个结果集的C#或VB.NET程序,并对每一行的Length字段求和。

  3. 修改sp_help的代码。

  4. 使用Transact SQL和sp_help无法做到这一点,因为无法处理多个结果集。

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

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

答案 3 :(得分:0)

我无法帮助您创建临时表来存储sp_help信息,但我可以帮助您计算行长度。看看这个MSDN article;它可以帮助你根据字段长度,类型等来计算这些内容。可能不会花太多时间将它转换为可以通过查询sysobjects等重用的SQL脚本。

编辑:

我正在编写我的报价来为它做一个脚本。我的方式远没有Vendoran那么容易。 :)

顺便说一句,我收回了我之前所说的关于无法帮助临时表的内容。我可以:你不能这样做。 sp_help输出七个行集,所以我认为你不能像原始问题中最初描述的那样做。我认为你坚持使用不同的方法来提出它。

答案 4 :(得分:0)

这将为您提供所需的所有信息

Select * into #mytables
from INFORMATION_SCHEMA.columns

select * from #mytables

drop table #mytables

<强>更新

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