5

我想备份一个 SQL Server 数据库,其中包含所有对象以及数据,但所有表中的数据应限制为每个表 100 行。我可以很容易地在 mysql 中做到这一点,但在 SQL Server 中我不知道该怎么做?

4

3 回答 3

5

您不能真正BACKUP DATABASE为此使用显式。但是你可以做这样的事情 - 但是请记住 - 正如我的评论 - 如果你依赖任何类型的数据完整性,这些数据的用途将是有限的,因为排序将是相对任意的,除非一切都是 1:1并且您碰巧对所有查询进行了神奇的方便排序,这将是一个庞大的数据大杂烩:

CREATE DATABASE copy_of_original;
GO

USE original_db;
GO

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

-- this assumes all tables are in `dbo` schema:
SELECT @sql = @sql + CHAR(13) + CHAR(10)
  + 'SELECT TOP (100) * INTO copy_of_original.dbo.' 
  + QUOTENAME(name) + ' FROM dbo.' + QUOTENAME(name) + ';'
FROM sys.tables
WHERE schema_id = 1;

PRINT @sql;
-- EXEC sp_executesql @sql;

完成此操作后,您可以备份copy_of_original- 但请记住,原始数据库中不存在任何索引或约束,并且TOP将从每个表(或整个表)中选择任意一组 100 行,对于少于 100 行的小表)。

于 2012-06-06T12:45:36.313 回答
0

你可以试试这个解决方案

  1. 请创建您的数据库的副本

  2. 在您的数据库副本中执行以下代码以从表中删除超过 100 行的行。

    sp_msforeachtable
    '改变表?NOCHECK CONSTRAINT ALL ; WITH [DUMMYTABLE] AS (SELECT RN = ROW_NUMBER() OVER (ORDER BY NEWID()), * FROM ?) DELETE FROM [DUMMYTABLE] WHERE RN > 100 ALTER TABLE ? 检查所有约束'

  3. 备份您的新数据库。

限制: 当我们禁用约束并从数据库中删除行时,备份数据库的数据完整性问题。

于 2012-06-06T13:59:26.940 回答
0

对于 SQL Server,我会使用工具“bcp”

不过,这需要一些编码:为每个表生成前 100 个选择语句并创建一个批处理文件

于 2012-06-06T11:30:26.890 回答