编写整个数据库 SQL-Server 的脚本

Posted

技术标签:

【中文标题】编写整个数据库 SQL-Server 的脚本【英文标题】:Script entire database SQL-Server 【发布时间】:2009-07-21 23:44:17 【问题描述】:

有没有一种方法可以从数据库中获取所有表、过程和其他对象的脚本?我知道有一个为数据库编写脚本的选项,但它只给了我某种***脚本,当然不是创建所有表、procs、udfs 等的脚本。

【问题讨论】:

他将它标记为 SQL Server 2008,所以我认为这就是他正在使用的。 这不是要去serverfault.com吗? 【参考方案1】:

来自管理工作室 右键单击您的数据库。 任务 -> 生成脚本。

应该可以的。

【讨论】:

另一种选择是使用 SQL SMO 并以编程方式编写脚本(即,如果需要常规脚本) 有没有办法设置一个脚本来做到这一点,所以无论谁运行它,设置总是相同的?我预见我们开发团队的人每次都会用不同的设置覆盖这个文件...... @Joe,我会沿着 RobS 所说的路线前进。您应该能够使用 PowerShell 做到这一点。否则,请开始查看 RedGate 工具或 Visual Studio Team Systems with Database Developer。 默认情况下它不对数据编写脚本。在表/视图选项下选择“脚本数据 -> True”。另一个有用的选项是“Script Drop -> True” 生成的脚本不会包含有关列排序的任何信息,除非您在菜单 Extra > Options > Script generation 中选择了最后一个选项。在德语中,选项是“Sortierung einschließen”。即使这些选项中的大多数都包含在生成脚本的向导中,但这个不是(SQL Server 2008)。您确实必须在调用向导之前选择该选项。【参考方案2】:

我编写了一个名为SchemaZen 的开源命令行实用程序来执行此操作。它比管理工作室的脚本要快得多,而且它的输出对版本控制更友好。它支持脚本模式和数据。

要生成脚本运行:

schemazen.exe 脚本 --server localhost --database db --scriptDir c:\somedir

然后从脚本运行重新创建数据库:

schemazen.exe create --server localhost --database db --scriptDir c:\somedir

【讨论】:

嗨,我想从我在 Visual Studio 中创建的本地数据库中获取 SQL QUERY,我该如何使用这个工具呢?我必须使用 .sdf 文件方向或如何?谢谢。 它是一个紧凑的 SQL 数据库文件。 天哪,这太快了,太棒了。 @hobs 我很高兴你发现它很有用。 :D @SethReno 在我的数据库上损坏了 sys 索引 = SMO 无法编写任何脚本,你的脚本可以,所以基本上为我节省了大量手动做废话的时间。顺便说一句,所有东西的逆向工程速度都非常快,比 SSMS 快 1000 倍,而且它本身似乎比 SMO 快(尤其是因为启动时间)。【参考方案3】:

我为此任务编写了一个实用程序,SMOscript。

脚本生成由 SMO 库执行,支持 SQL 2005 和 2008 中的新对象类型。

【讨论】:

嗯,我在我的 Vista 64 位上安装了你的 smo 应用程序。安装成功,但在我的程序目录或所有程序列表中没有看到项目【参考方案4】:

我们最终结合使用 SSMS 脚本生成来提取模式和数据,然后使用我们自己的数据库工具,该工具允许在脚本中进行关键字解析和基于令牌的替换。它还确保脚本只应用一次。

为什么?

我们需要支持在 SQL Server 2000、2005 和 2008 上安装,并且版本之间的数据类型有变化,例如2005+ 有 nvarchar(max),而 2000 只支持 ntext。所以我们的脚本使用一个标记,并根据 db 选择替换为正确的类型。 某些脚本的执行需要在执行后等待一段时间,例如我们发现,如果您在通过脚本创建新数据库后没有等待几秒钟,SQL Server 在继续创建表等时有时可能会失败(因为它没有时间创建 db 文件)。 我们希望保留执行脚本的历史记录。 我们希望允许我们的 Wix MSI 安装程序指定连接字符串和凭据,并且需要某种方式将这些传递到脚本中,因此再次使用令牌和一些条件逻辑。

示例脚本(为简洁而编辑)

-- Sleep: 5 
-- Sleep after creating database to allow file system to create db files
CREATE DATABASE [$Database$]
GO

EXEC sp_dbcmptlevel [$Database$], $CompatabilityLevel$
GO

USE [$Database$]
GO

IF '1'!='$IntegratedSecurity$'
BEGIN
    CREATE LOGIN [$Login$] WITH PASSWORD=N'$Password$', DEFAULT_DATABASE=[$Database$]
    CREATE USER [$User$] FOR LOGIN [$Login$]
    EXEC sp_addrolemember N'db_owner', N'$User$'
END
GO

【讨论】:

【参考方案5】:

我建议查看 RedGate SQL 打包程序。它不是免费的,但已经足够有用,物有所值。

【讨论】:

【参考方案6】:

只看表格数据,在Management Studio 2012和2014中输出所有表格数据内容,有点隐蔽,但看了几眼找到了这个选项:

    右键单击数据库 选择“任务”>“生成脚本...” 在“设置脚本选项”上,单击“高级” 在“常规”下,将“脚本的数据类型”设置为 true(它位于“常规”组的底部)

【讨论】:

【参考方案7】:

如果您需要以编程方式执行此操作,您可以针对 SQL Server 2000 使用 SQL DMO 库 (OLE),但您更可能希望针对 SQL Server 2005 及更高版本使用 SQL SMO 库(本机 .NET 库) .

这两个库都是 SQL Server 管理工具安装不可或缺的一部分。

这是在从 SQL Server Management Studio 生成完整数据库脚本不足的情况下。

【讨论】:

以上是关于编写整个数据库 SQL-Server 的脚本的主要内容,如果未能解决你的问题,请参考以下文章

SQL-Server to Access 处理 NULL

SQL 替换类型化 XML 数据

[Sql-Server]密码盐和哈希值使用啥数据类型以及啥长度?

SQL-Server使用点滴

SQL-SERVER 常用数据类型

尝试在 sql-server 上迁移时 Flyway 挂起