我是SQL Server的新手。我曾尝试在网上徘徊一段时间,但无法回答我的问题。任何人都可以告诉我SQL Server 2008数据库中存储的视图究竟在哪里?
答案 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。
的详细信息