Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server行长度_Sql Server_Stored Procedures - Fatal编程技术网

Sql server SQL Server行长度

Sql server SQL Server行长度,sql-server,stored-procedures,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), Fi

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

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_帮助结果的正确CREATE TABLE语句是什么?

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

编辑:

我正在修改我的提议,为它写剧本。我的路远没有文多兰的容易


顺便说一句,我收回我之前说过的关于不能帮助临时表的话。我能:你做不到。sp_help输出七个行集,因此我认为您无法执行原始问题中最初描述的操作。我想你不得不用另一种方法来解决这个问题。

你是怎么用这种方法来解决的

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
试试这个:

--汇总所有列的长度

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_帮助“表”中显示的长度相同

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

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


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

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

Select * into #mytables
from INFORMATION_SCHEMA.columns

select * from #mytables

drop table #mytables
更新:

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

上述答案均不正确或有效

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

我唯一的工作方法是:

  • exec sp_help“mytable”-然后将第二个结果集的长度字段相加(如果从查询分析器或Management Studio工作-只需将结果复制并粘贴到电子表格中,然后进行求和)

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

  • 修改sp_帮助的代码

  • 使用Transact-SQL和sp_帮助无法完成此操作,因为无法处理多个结果集

    FWIW:ResultSet的表定义可在此处找到: