【问题标题】:SQL Server Row LengthSQL Server 行长度
【发布时间】:2008-10-22 20:33:46
【问题描述】:

我正在尝试通过执行以下存储过程来确定表的行长度(以字节为单位):

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 语句是什么?

【问题讨论】:

    标签: sql-server stored-procedures


    【解决方案1】:

    如何改为这种方式?

    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' 中出现的长度相同

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

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

      如果您对 sp_help 返回的长度感兴趣并将其相加,那么我认为(我不是 100% 确定)对 sysobjects 的查询返回相同的数字。它们是否代表完整的最大行大小?不,您缺少诸如 NULL 位图之类的东西。它们是否代表了对您的实际数据的真实衡量?不,如果您只存储 100 个字符,VARCHAR(500) 也不会占用 500 个字节。此外,与行分开存储的 TEXT 字段和其他字段不显示其实际大小,仅显示指针的大小。

      【讨论】:

        【解决方案3】:

        上述答案均不正确或无效。

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

        我拥有的唯一方法是:

        1. exec sp_help 'mytable' - 然后将第二个结果集的长度字段相加(如果使用 Query Analyzer 或 Management Studio 工作 - 只需将结果复制并粘贴到电子表格中并进行求和)

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

        3. 修改sp_help的代码。

        这不能使用 Transact SQL 和 sp_help 完成,因为无法处理多个结果集。

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

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

        【讨论】:

          【解决方案4】:

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

          编辑:

          我正在修改我为它编写脚本的提议。我的方式远没有 Vendoran 的那么容易。 :)

          顺便说一句,我收回我之前所说的关于无法帮助处理临时表的内容。我可以:你做不到。 sp_help 输出七个行集,因此我认为您无法执行原始问题中最初描述的操作。我认为你被困在使用不同的方法来想出它。

          【讨论】:

            【解决方案5】:

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

            Select * into #mytables
            from INFORMATION_SCHEMA.columns
            
            select * from #mytables
            
            drop table #mytables
            

            更新:

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

            【讨论】:

              猜你喜欢
              • 2019-02-02
              • 1970-01-01
              • 1970-01-01
              • 2022-12-08
              • 1970-01-01
              • 2014-02-21
              • 2013-02-10
              • 1970-01-01
              • 2015-08-12
              相关资源
              最近更新 更多