SQL 高级脚本选项

Posted

技术标签:

【中文标题】SQL 高级脚本选项【英文标题】:SQL Advanced scripting options 【发布时间】:2017-03-22 14:30:49 【问题描述】:

我想生成一个脚本,它会给我一个“插入”查询,其中包含我现有数据库中的数据,但只有每个表中按 ID 排序的前 1000 行。 我尝试使用位于 Management Studio 中的“生成脚本...”(MyDatabaseName -> 任务 -> 生成脚本...)为单个表生成查询,然后我在 C# 中编写了一个简单的函数,该函数将数据到 1000 第一行,但当您有数百个表时,这不是一个好主意

List<string> script = File.ReadLines(@"script.sql").Take(1000).ToList();
File.WriteAllLines(@"top1000.sql", script);

【问题讨论】:

这似乎是个好主意。现在,怎么了?你有没有尝试过,但没有奏效?你应该edit 让我们知道 1) 你尝试了什么 2) 结果是什么 3) 为什么这个结果不被你接受 是否需要考虑外键? 你可以看看here。这将对您有所帮助。 如果您想将其限制为 1000 行,您需要在每个表中定义顶部的含义。根据定义,表是一个无序集,顶部的概念需要一个顺序。除非你只想要任何 1000 行。但是从每个表中获取 1000 行的要求似乎很奇怪。几乎就像创建一个测试数据库,但它可能会因为 RI 而无法工作。 @GarethLyons 不,我不需要外键 【参考方案1】:

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

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

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

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;

【讨论】:

以上是关于SQL 高级脚本选项的主要内容,如果未能解决你的问题,请参考以下文章

sql怎么把表结构导出来

navicat for MySQL怎么导出SQL脚本

sql 高级T-SQL脚本(从这里和他们收集)

怎么导出Sql Server数据库表结构和数据的脚本

使用 Visual Studio 2012 高级版导出架构比较升级脚本到 transact-sql

Mysql 基本语句 + 高级查询