如何在不使用UI的情况下在SQL SERVER 2008 R2中生成脚本?

时间:2012-08-28 12:02:43

标签: sql-server-2008 sql-server-2008-r2

您好我正在使用SQL SERVER 2008 R2,有人可以帮我生成像create,alter这样的脚本而不使用UI。

4 个答案:

答案 0 :(得分:5)

存储过程,视图,函数等都可以从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_NULLSQUOTED_IDENTIFIER - {{3 }}

表格有点棘手。如果在分析器运行时在SSMS中生成脚本,您将看到它通过一系列查询执行此操作并在代码中构造create table脚本(换句话说,您无法嗅探它)。它可能非常复杂,具体取决于您对表使用的选项,是否需要编写所有外键和依赖对象的脚本等。为此,我更倾向于which you can get from the same view中突出显示的SMO方法。

如果您已经在使用SSMS,那么我不明白不使用生成脚本菜单项的目的。如果单例方法是问题,则可以使用对象资源管理器详细信息而不是对象资源管理器对多个对象执行此操作:

enter image description here

答案 1 :(得分:3)

您可以使用SQL管理对象(SMO)中的Scripter类来执行此操作。

例如:http://www.mssqltips.com/sqlservertip/1833/generate-scripts-for-database-objects-with-smo-for-sql-server/

答案 2 :(得分:1)

试试这个:

使用以下步骤创建一个sproc。

1.首先获取您需要创建表脚本的所有表名。

2.浏览每个表并获得以下信息:

  select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE  from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 'tablename'

3.现在循环本身尝试动态填充create table脚本。

答案 3 :(得分:0)

我编写了一个名为SchemaZen的开源命令行实用程序来执行此操作。它比管理工作室的脚本快得多,它的输出更适合版本控制。它支持脚本化架构和数据。

生成脚本运行:

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

然后从脚本运行:

重新创建数据库
schemazen.exe create --server localhost --database db --scriptDir c:\somedir