首先对不起我的英语,我知道这不完美
我的数据库中有表格,我有大约40列,我需要在此表中获取一些记录的大小才能生成报告。
我尝试用dbcc SHOWCONTIG做一些事情,但我没有得到满意的结果。
您有什么建议/想法来解决我的问题吗? 感谢帮助!
答案 0 :(得分:1)
建议使用参考信息编写基于内容计算的查询:http://www.connectionstrings.com/sql-server-data-types-reference/
E.g。假设您的表格有两列:A varchar(20)
和datetime
。然后你的查询看起来像这样:
SELECT RowID, -- Some identifier for the row, e.g. primary key
LEN(varcharcolumn) + 2 -- Length of varchar is L + 2 bytes
+ 8 -- Length of datetime column is 8 bytes
) AS TotalBytes
-- Add WHERE clause to restrict rows in report
答案 1 :(得分:0)
假设您需要数据类型长度,请尝试从INFORMATION_SCHEMA中选择以获取表的结构。
像
这样的东西SELECT * FROM INFORMATION_SCHEMA.COLUMNS;
应该足够了。 CHARACTER_MAXIMUM_LENGTH列为您提供字符串长度。
答案 2 :(得分:0)
我不确定我是否完全了解您的需求,但DataLength
函数可能会对您有所帮助:
select DataLength(ColumnOfInterest)
from TableName
where <filter condition>
表示一组列:
select DataLength(ColumnOfInterest1) + DataLength(ColumnOfInterest2) + etc.
from TableName
where <filter condition>
答案 3 :(得分:0)
在sql server中很容易获得表的大小。所以另一种方法是将你想要过滤的记录存储在一个单独的表中,然后只是得到表的大小。
以下是一个例子:
--CREATE A TABLE TO STORE YOUR FILTERED RECORDS
CREATE TABLE dbo.resulttable
(
id INT,
employee VARCHAR(32)
)
GO
--INSERT FILTERED RECORDS IN NEW TABLE
INSERT INTO dbo.resulttable (id,employee)
SELECT id,employee FROM dbo.originaltable WHERE id > 100
GO
--GET SIZE OF TABLE WHICH HAS THE FILTERED RECORDS WITH HOWEVER MANY COLUMNS
SELECT
t.name AS TableName,
p.rows AS RowCounts,
SUM(a.total_pages) * 8 AS TotalSpaceKB,
SUM(a.used_pages) * 8 AS UsedSpaceKB,
(SUM(a.total_pages) - SUM(a.used_pages)) * 8 AS UnusedSpaceKB
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.object_id = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
INNER JOIN
sys.allocation_units a ON p.partition_id = a.container_id
WHERE
t.NAME = 'resulttable'
GROUP BY
t.Name, p.Rows
ORDER BY
t.Name
GO