嗨,我正在使用 SQL SERVER 2008 R2,有人可以帮我生成一个脚本,如创建、更改而不使用 UI。
4 回答
存储过程、视图、函数等都可以被脚本化,sys.sql_modules
只要它们没有被加密:
SELECT definition
FROM sys.sql_modules
WHERE [object_id] = OBJECT_ID(N'dbo.object_name');
或者,如果您想编写多个脚本:
SELECT definition + CHAR(13) + CHAR(10) + 'GO'
FROM sys.sql_modules
WHERE OBJECT_NAME([object_id]) IN (N'name1', N'name2', ...);
或全部:
SELECT '--' + QUOTENAME(OBJECT_SCHEMA_NAME([object_id]))
+ '.' + QUOTENAME(OBJECT_NAME([object_id]))
+ CHAR(13) + CHAR(10) + definition
+ CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10)
FROM sys.sql_modules
WHERE definition IS NOT NULL;
(当然,如果您在 Management Studio 中运行它们并且任何超过那里的输出字符串的最大长度,大约 8K 的文本结果,这些都注定要失败。但听起来您想在其他地方使用这些。)
请注意,这不会为创建对象时有效的 SET 设置编写脚本,但您可以扩展此查询以包括ANSI_NULLS
和QUOTED_IDENTIFIER
-您可以从同一视图中获取的设置。
表有点棘手。如果您在分析器运行时在 SSMS 中生成脚本,您将看到它通过大量查询执行此操作并在代码中构造创建表脚本(换句话说,您无法嗅出它)。它可能非常复杂,具体取决于您为表使用的选项,是否需要编写所有外键和依赖对象的脚本等。为此,我更喜欢podiluska 的答案中突出显示的 SMO 方法。
如果您已经在使用 SSMS,那么我不明白不使用生成脚本菜单项的目的。如果单例方法存在问题,您可以使用对象资源管理器详细信息而不是对象资源管理器对多个对象执行此操作:
您可以使用Scripter
SQL 管理对象 (SMO) 中的类来执行此操作。
试试这个:
使用以下步骤创建存储过程。
1.首先获取您需要创建表脚本的所有表名。
2.遍历每个表并获取以下信息:
select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'tablename'
3.现在在循环本身尝试动态填充创建表脚本。
我编写了一个名为SchemaZen的开源命令行实用程序来执行此操作。它比管理工作室的脚本要快得多,而且它的输出对版本控制更友好。它支持脚本模式和数据。
要生成脚本运行:
schemazen.exe 脚本 --server localhost --database db --scriptDir c:\somedir
然后从脚本运行重新创建数据库:
schemazen.exe 创建 --server localhost --database db --scriptDir c:\somedir