我有一个超过 100GB 的庞大数据库,我需要在 CD 或 DVD 上刻录一个使用这个庞大数据库的应用程序(用于演示目的)...有没有办法在所有表中仅保留前 100 条记录?
提前致谢。
答案1
创建数据库副本并使用如下结构将必要的数据复制到其中:
exec sp_MSforeachtable'选择前 100 名*进入[新数据库]。[?] 从 [旧数据库].[?]';
答案2
我有时必须做类似的事情,通常是当我将生产数据库投入开发或测试时。
大多数情况下,我会尝试确定是否有几张表占据了几乎所有的空间——通常都是这样的。
运行此脚本:
DECLARE @table_name VARCHAR(500)
DECLARE @schema_name VARCHAR(500)
DECLARE @tab1 TABLE(
tablename VARCHAR (500) collate database_default
,schemaname VARCHAR(500) collate database_default
)
CREATE TABLE #temp_Table (
tablename sysname
,row_count BIGINT
,reserved VARCHAR(50) collate database_default
,data VARCHAR(50) collate database_default
,index_size VARCHAR(50) collate database_default
,unused VARCHAR(50) collate database_default
)
INSERT INTO @tab1
SELECT Table_Name, Table_Schema
FROM information_schema.tables
WHERE TABLE_TYPE = 'BASE TABLE'
DECLARE c1 CURSOR FOR
SELECT Table_Schema + '.' + Table_Name
FROM information_schema.tables t1
WHERE TABLE_TYPE = 'BASE TABLE'
OPEN c1
FETCH NEXT FROM c1 INTO @table_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @table_name = REPLACE(@table_name, '[','');
SET @table_name = REPLACE(@table_name, ']','');
--make sure the object exists before calling sp_spaceused
IF EXISTS(SELECT id FROM sysobjects WHERE id = OBJECT_ID(@table_name))
BEGIN
INSERT INTO #temp_Table EXEC sp_spaceused @table_name, false;
END
FETCH NEXT FROM c1 INTO @table_name
END
CLOSE c1
DEALLOCATE c1
SELECT t1.*
,t2.schemaname
FROM #temp_Table t1
INNER JOIN @tab1 t2 ON (t1.tablename = t2.tablename )
ORDER BY schemaname,t1.tablename;
DROP TABLE #temp_Table
我不是自己写的,而是把它放在一个文本文件中,我很惭愧,我不再记得要归功于什么来源了...顺便说一下,您可以在 Management Studio 中做同样的事情(在详细信息视图中添加“大小”列)。
现在您知道哪些表占用了最多的空间,并且可以单独处理它们。
编辑:找到来源:http://www.howtogeek.com/howto/database/determine-size-of-a-table-in-sql-server/