视图存储在SQL Server中的哪个位置

时间:2013-02-07 09:35:36

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

我是SQL Server的新手。我曾尝试在网上徘徊一段时间,但无法回答我的问题。任何人都可以告诉我SQL Server 2008数据库中存储的视图究竟在哪里?

5 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

可以使用T-SQL系统视图(link)查询所有用户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.definition列:definition = object_definition(o.id)。如果您查看object_definition函数(link),您会看到返回类型为nvarchar(max)

答案 2 :(得分:1)

在系统表中。

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

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

要查看正常编辑,您可以查看工作室管理器中表格下的视图文件夹。

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

答案 3 :(得分:0)

如果您指的是视图生成的表格,那么答案就是它们根本不存储。视图只是一个查询,就是它存储的全部内容。查询视图时,db引擎只会获取查看查询的结果,然后查询这些结果。

数据库引擎可以存储&#39;具体化&#39;观点,但这是一个不同的主题。

答案 4 :(得分:0)

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

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

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

有关View MSDN

的详细信息
相关问题