10

我是 SQL Server 新手。我已经尝试在网上四处寻找一段时间,但无法回答我的问题。谁能告诉我 SQL Server 2008 数据库中存储的视图到底在哪里?

4

5 回答 5

7

对您的问题的迂腐回答是……只有 Microsoft 确切知道视图元数据的物理存储位置。在从 SQL 2000 迁移到 SQL 2005(2008 所基于)的过程中,MS 摆脱了对过去存储视图(dbo.sysviews 和 dbo.syscomments)的系统表的直接访问,并添加了一个抽象层(通过隐藏资源数据库),这意味着您只能通过目录视图访问有关视图的元数据。INFORMATION_SCHEMA 是一组符合 ANSI 的目录视图。虽然对它们在版本之间的相对可移植性有点用处,但通常可以从 sql 2008 目录视图中获得更多信息 - 在本例中为 sys.viewssys.sql_modules

请注意,可以使用 ENCRYPTION 选项集创建视图,该选项集加密包含视图的 SQL 定义的 sys.comments 记录。但如果没有加密,那么 sp_helptext [MyView] 会让您快速查看定义。

根据下面的第一条评论进行编辑,将“sys.comments”替换为“sys.sql_modules”

于 2013-02-07T10:41:41.170 回答
4

注意:基于这篇文章 http://improve.dk/archive/2012/08/27/where-does-sql-server-store-the-source-for-stored-procedures.aspx,很可能是定义视图存储(也)在sys.sysobjvalues系统表中。

T-SQL可以使用sys.sql_modules系统视图(链接)查询所有用户模块的列表(在 SQL Server 2008 中)。在这里,您可以找到用户视图的定义(列 definition):

SELECT  QUOTENAME(s.name)+'.'+QUOTENAME(o.name) AS full_object_name, 
        m.*
FROM    sys.sql_modules m
JOIN    sys.objects o ON m.object_id=o.object_id
JOIN    sys.schemas s ON o.schema_id=s.schema_id
WHERE   o.type='V' -- only view objects
ORDER BY full_object_name

如果你运行EXEC sp_helptext 'sys.sql_modules'你会得到这个系统视图的源代码:

CREATE VIEW sys.sql_modules AS
    SELECT object_id = o.id,
        definition = object_definition(o.id),
        uses_ansi_nulls = sysconv(bit, o.status & 0x40000),             -- OBJMOD_ANSINULLS
        uses_quoted_identifier = sysconv(bit, o.status & 0x80000),      -- OBJMOD_QUOTEDIDENT
        is_schema_bound = sysconv(bit, o.status & 0x20000),             -- OBJMOD_SCHEMABOUND
        uses_database_collation = sysconv(bit, o.status & 0x100000),    -- OBJMOD_USESDBCOLL
        is_recompiled = sysconv(bit, o.status & 0x400000),              -- OBJMOD_NOCACHE
        null_on_null_input = sysconv(bit, o.status & 0x200000),         -- OBJMOD_NULLONNULL
        execute_as_principal_id = x.indepid
    FROM sys.sysschobjs o
    LEFT JOIN sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNER
    WHERE o.pclass <> 100
        AND ((o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1)
            OR (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1)
            OR (type IN ('R','D') AND o.pid = 0))

你可以看到这个视图查询了另一个系统对象sys.sysschobjs ,我认为它是用于存储视图定义的系统表

注意 1:使用INFORMATION_SCHEMA.VIEWS来查找视图的定义不是一种可靠的方法,因为INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION列定义是convert(nvarchar(4000), object_definition(object_id))(最多 4000 个字符)。

注意 2:相反,您应该使用sys.sql_modules.definitioncolumn: definition = object_definition(o.id)。如果您查看object_definition函数(链接),您会看到返回类型是nvarchar(max).

于 2013-02-07T10:31:57.920 回答
2

在系统表中。

以下查询将检索它们...

SELECT TABLE_NAME 作为 ViewName,VIEW_DEFINITION 作为 ViewDefinition FROM INFORMATION_SCHEMA.Views

要正常查看编辑它们,您将在工作室管理器的表格下查看视图文件夹。

您可以使用设计器或编写脚本从此文件夹创建/编辑它们。

于 2013-02-07T09:39:57.283 回答
2

如果您的意思是视图生成的表,那么答案是它们根本没有存储。视图只是一个查询,这就是它所存储的全部内容。当您查询视图时,数据库引擎只会获取您的视图查询的结果,然后查询这些结果。

数据库引擎可以存储“物化”视图,但这是一个不同的主题。

于 2013-02-07T09:40:04.580 回答
1

View 是一个简单的 SQL 语句,存储在数据库模式 (INFORMATION_SCHEMA.Views) 中。因此,每当我们调用视图时,SQL 语句都会被执行并从主物理表返回行。

您还可以将视图视为存储定义(sql 语句)但不存储结果的逻辑表。

您可以使用以下语句查看定义,正如上面 Dan 所说,仅当视图定义未加密时:SELECT TABLE_NAME 作为 ViewName,VIEW_DEFINITION 作为 ViewDefinition FROM INFORMATION_SCHEMA.Views

有关查看@MSDN的更多详细信息。

于 2013-02-07T10:13:57.783 回答