通过 T-SQL 在 SQL Server 中获取对象脚本?

Sae*_*ati 5 sql-server scripting

我需要获取SQL Server 数据库中对象的创建脚本。我需要用于创建它的完全相同的脚本。就像当您使用 SSMS 更改已定义的视图时,脚本就在那里,就像您之前定义的那样。

我需要在 T-SQL 中执行此操作。SQL Server 在哪里存储与数据库对象相关的脚本?我在系统目录视图中找不到相关视图。

我试图找到的是这样的:

select creation_script -- I know this column doesn't exist
from sys.objects
where name = 'CustomersView'
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 6

这在 T-SQL 中是不可行的。并非所有对象都存储了定义,您必须对表和索引等基本内容的 CREATE 脚本进行逆向工程。

与其重新发明轮子(在 T-SQL 中),不如做正确的事情并重用专用于此目的的组件 SMOScripter类。已经可用、有效、与所有最新的 SQL Server 对象保持同步,可以与 SMO 一起免费重新分发。只需将您的脚本逻辑移出 T-SQL。


Sol*_*zky 6

虽然不争论最全面的方法是像 Remus 在他的回答中建议的那样使用 SMO ,但这个问题确实要求通过 T-SQL 获取信息,并且某些对象确实存在该信息。请记住,此信息:

  • 涵盖一小组对象类型
  • 不包括任何GRANT/DENY语句。但是您可以从sys.database_permissions和获取该信息sys.database_principals
  • 不包含任何IF EXISTS DROP逻辑
  • 不包括的会话设置ANSI_NULLSQUOTED_IDENTIFIER。您sys.sql_modules通过[uses_ansi_nulls][uses_quoted_identifier]字段获得的那些。
  • 可能不包括架构名称。如果架构名称未在 CREATE(或 ALTER)语句中明确说明,则架构名称将不是定义的一部分。在创建对象时,架构将是创建对象的用户的默认架构。如果架构名称未包含在定义中并且不能假定为类似的名称dbo,则必须通过OBJECT_SCHEMA_NAME([object_id])

对象目录视图

sys.sql_modules目录视图有充分CREATE...的下列对象的语句(任何加密,将返回NULL[definition]):

  • SQL 存储过程
  • 复制过滤程序
  • 看法
  • SQL DML 触发器
  • SQL 数据库级 DDL 触发器
  • SQL 标量函数
  • SQL 内联表值函数
  • SQL 表值函数
  • 规则(旧式,独立)
  • 默认(独立,非约束)
SELECT OBJECT_SCHEMA_NAME([object_id]) AS [SchemaName],
       OBJECT_NAME([object_id]) AS [ObjectName],
       *
FROM   sys.sql_modules;
Run Code Online (Sandbox Code Playgroud)

sys.check_constraintssys.default_constraints目录视图将返回它们各自的约束作为逻辑部分[definition]

SELECT *
FROM   sys.check_constraints;

SELECT *
FROM   sys.default_constraints;
Run Code Online (Sandbox Code Playgroud)

元数据功能

OBJECT_DEFINITION函数将返回那就是在相同的数据[definition]前面提到的三个目录视图的领域,基于指定的[object_id]

SELECT so.name,
       so.[type],
       so.type_desc,
       OBJECT_DEFINITION(so.[object_id]) AS [Definiton]
FROM   sys.objects so
WHERE  OBJECT_DEFINITION(so.[object_id]) IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

其他对象

以下是一些用于查找与所有对象类型相关的元数据的资源: