SQL 高级脚本选项

SQL Advanced scripting options

我想生成一个脚本,它将给我一个 "insert" 查询,其中包含来自我现有数据库的数据,但只有每个 table 中按 ID 排序的前 1000 行。 我尝试使用位于 Management Studio 中的 "Generate scripts..."(MyDatabaseName -> Tasks -> Generate scripts...)为单个 table 生成查询,然后我在 C# 中编写了一个简单的函数,它将数据剪切到第一行 1000 行,但是当你有数百个 tables

时,这不是一个好主意
List<string> script = File.ReadLines(@"script.sql").Take(1000).ToList();
File.WriteAllLines(@"top1000.sql", script);

下面的脚本将为源数据库中的所有 table 生成语句,将 1000 条随机记录复制到另一个空数据库。

请注意,"select * insert into ..." 语句仅在目标 table 不存在时才有效。

ORDER BY使用table的主键。
如果有的话。

SELECT CONCAT('SELECT ',
'TOP 1000 ',
'* INSERT INTO ',
'[TargetDb]', -- replace with the name of the database you want to copy to
'.',QUOTENAME(t.TABLE_NAME),
' FROM ',QUOTENAME(t.TABLE_SCHEMA),'.',QUOTENAME(t.TABLE_NAME),
' ORDER BY ' + QUOTENAME(k.PrimaryKeyName),';'
) as InsertStatement
FROM INFORMATION_SCHEMA.TABLES t
LEFT JOIN (
    SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME as PrimaryKeyName
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE OBJECTPROPERTY(OBJECT_ID(QUOTENAME(CONSTRAINT_SCHEMA) + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
) k ON (t.TABLE_SCHEMA = k.TABLE_SCHEMA and t.TABLE_NAME = k.TABLE_NAME)
WHERE t.TABLE_TYPE = 'BASE TABLE'
AND t.TABLE_SCHEMA = 'dbo' -- replace with the name of the source database you want to copy from

ORDER BY t.TABLE_SCHEMA, t.TABLE_NAME;