在SQL Server中如何查看数据库视图的定义呢? 其实官方文档已经有一个较详细的总结了,这里在官方文档的基础上,我们再深入展开分析一下,例如如何获取系统视图的定义。知其然知其所以然吗。

1:使用SQL Server Management Studio(SSMS)

在“对象资源管理器”中,首先找到对应数据库中需要查看定义的视图,右键单击获取对象的定义脚本。这种方式非常简单。在此略过。

2:通过脚本查看视图的定义。

可以通过下面三种方式获取定义脚本,如下所示

USE YourSQLDba;  

GO  

SELECT definition, uses_ansi_nulls, uses_quoted_identifier, is_schema_bound  

FROM sys.sql_modules  

WHERE object_id = OBJECT_ID('PerfMon.SessionInfo');   

GO  

 

 

 

 

 

USE YourSQLDba;  

GO 

SELECT OBJECT_DEFINITION (OBJECT_ID('PerfMon.SessionInfo')) AS ObjectDefinition;   

GO  

 

 

 

 

USE YourSQLDba;  

GO 

EXEC sp_helptext 'PerfMon.SessionInfo'; 

那么上面方式可以查看系统视图的定义吗? 实验验证测试一下即可知道。

1:首先,在SSMS的“对象资源管理器”中是是无法查看系统视图的定义的。SSMS直接屏蔽了相关功能。

2:上面三种脚本方式,sys.sql_modules 无法查看系统视图定义,内置函数OBJECT_DEFINITION、系统存储过程OBJECT_DEFINITION可以查看系统视图的定义。

系统视图无法查看对应的系统定义是因为条件限制原因(has_access('CO', o.id) = 1),如下所示:

SET QUOTED_IDENTIFIER ON

SET ANSI_NULLS ON

GO

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,

        uses_native_compilation = sysconv(bit, case when (o.type = 'P') then o.status & 0x00000200 else 0 end)    -- OBJPRC_HEKATON

    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 -- x_eunc_Server

        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))

        AND (o.status2 & 0x00000020) = 0

 

GO

如果你到这一步以为就结束了的话,那么你太天真了。内置函数OBJECT_DEFINITION、系统存储过程OBJECT_DEFINITION对于有些视图也束手无策。如下所示,获取系统视图sys.parameters的定义如下。

CREATE VIEW sys.parameters

AS

    SELECT  object_id ,

            name ,

            parameter_id ,

            system_type_id ,

            user_type_id ,

            max_length ,

            PRECISION ,

            scale ,

            is_output ,

            is_cursor_ref ,

            has_default_value ,

            is_xml_document ,

            default_value ,

            xml_collection_id ,

            is_readonly ,

            is_nullable

    FROM    sys.parameters$

    WHERE   number = 1

其实对象sys.parameters$也是一个视图,正常情况下是无法查看sys.parameters$这个对象的,在专用管理员模式(DAC)下面才可以查看sys.parameters$的定义,而且只能通过系统内置函数OBJECT_DEFINITION,而sp_helptext 是会报错的。如果你要弄清楚一些系统视图的定义,那么基本上就要借助专用管理员模式(DAC)模式来查看。

USE YourSQLDba;

GO

SELECT OBJECT_DEFINITION (OBJECT_ID('sys.parameters$')) AS ObjectDefinition;

GO

CREATE VIEW sys.parameters$ AS

    SELECT c.id AS object_id,

        c.number, c.name,

        c.colid AS parameter_id,

        c.xtype AS system_type_id,

        c.utype AS user_type_id,

        c.length AS max_length,

        c.prec AS precision,

        c.scale AS scale,

        sysconv(bit, c.status & 512) AS is_output,        -- CPM_OUTPUT

        sysconv(bit, c.status & 1024) AS is_cursor_ref,    -- CPM_CURSORREF

        sysconv(bit, isnull(v.objid, 0)) AS has_default_value,

        sysconv(bit, c.status & 2048) AS is_xml_document, -- CPM_XML_DOC        

        v.value AS default_value,

        xmlns AS xml_collection_id,

        sysconv(bit, c.status & 4194304) AS is_readonly, -- CPM_IS_READONLY = 0x00400000

        sysconv(bit, 1 - (c.status & 1)) AS is_nullable -- CPM_NOTNULL  = 0x00000001

    FROM sys.syscolpars c

    LEFT JOIN sys.sysobjvalues v ON v.valclass = 9 AND v.objid = c.id AND v.subobjid = c.colid AND v.valnum = 0    -- SVC_PARAMDEFAULT

    WHERE number > 0 AND has_access('CO', c.id) = 1

其实在专用管理员模式(DAC)下面,虽然能查到sys.parameters$的定义,但是在基表sys.sysschobjs里面找不到sys.parameters$这个对象,其实你可以找到系统的Resource数据库

一般位于<drive>:\Program Files\Microsoft SQL Server\MSSQL<version>.<instance_name>\MSSQL\Binn\下面(以实际安装路径为准),名字为mssqlsystemresource.mdf ,你可以将其Copy到其它位置后,然后附加重命名为一个数据库,例如我附加为resource数据库,然后你就可以在SSMS界面直接获取系统视图的定义了。

注意,在SQL Server 2014测试发现,SQL Server里面看不到System Tables下的相关基表了,应该是其屏蔽了这些功能,下面截图是在SQL Server 2008 R2测试环境。

参考资料:

https://docs.microsoft.com/en-us/sql/relational-databases/views/get-information-about-a-view

SQL Server查看视图定义总结的更多相关文章

  1. SQL Server 查看表定义的 2 种方法

    方法 1. 用SQL Server Management Studio 第一步找到要查看的表,右键 第二步点设计 方法 2. sp_help @objname = 'tableName' execut ...

  2. SQL Server系统视图sys.master_files不能正确显示数据库脱机状态

    最近发现在SQL Server数据库(目前测试过SQL Server 2008, 2012,2014,2016各个版本)中,即使数据库处于脱机(OFFLINE)状态,但是sys.master_file ...

  3. sql server 查看对象最后修改时间

    sql server 查看对象最后修改时间,根据最后修改时间排序 存储过程 SELECT * FROM sys.all_objects WHERE  TYPE='P' ORDER BY modify_ ...

  4. SQL Server 系统视图

    SQL Server系统视图非常的多,因此不可能一个一个地写,我最近一直在想,对于数据库的系统视图应该如何学,但是看了一下目录之后,我呆了,我觉得每个写一次,可能都要花费1个星期的时间,如果对每一个返 ...

  5. SQL SERVER分区视图

    借助SQL SERVER分区视图,可以对SQL中的表进行集中管理,下文将以实例的方式为您详解SQL SERVER分区视图,希望对您学习SQL数据库能有所帮助. SQL SERVER分区视图给我们提供了 ...

  6. SQL SERVER 查看mdf ldf文件路径

    SQL SERVER 查看mdf ldf文件路径 select filename from sysfiles

  7. SQL Server查看库、表占用空间大小

    转自:https://blog.csdn.net/yenange/article/details/50493580 查询数据文件与日志文件占用情况,查看数据大小,查看库大小 1. 查看数据文件占用(权 ...

  8. 刷新SQL Server所有视图、函数、存储过程

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  9. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

随机推荐

  1. Java面试题:小白不得不懂的斐波那契数列

    很长一段时间里,我都非常疑惑:“我写的技术文章不差啊,有内容的同时还很有趣,不至于每篇只有区区几十个人读啊?为什么有些内容简单到只有一行注册码的文章浏览量反而轻松破万?”这样的疑惑如鲠在喉啊!写技术博 ...

  2. 网络协议 9 - TCP协议(下):聪明反被聪明误

    网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网络协议 5 - I ...

  3. json对象和json字符串

    Javascript字符串与JSON字符串的最大区别在于,JSON字符串必须使用双引号(单引号会导致语法错误) 与Javascript的对象字面量相比,JSON对象有两个地方不一样.首先,没有声明变量 ...

  4. C++日志系统log4cxx使用总结

    原文地址:C++日志系统log4cxx使用总结作者:邵明 本文主要从log4cxx级别.layout.格式化.命名规则.Filter几个方面介绍.   一.log4cxx命名规则         Lo ...

  5. solr之环境配置四

    Solr链接数据库(mysql,mssql) 一.链接mysql 1.使用DataImportHandler导入并索引数据,配置 $SOLR_HOME\core0\conf\solrconfig.xm ...

  6. IdentityServer4之Implicit(隐式许可) —— oidc-client-js前后端分离

    IdentityServer4之Implicit(隐式许可) —— oidc-client-js前后端分离 参考 官方文档:oidc-client-js:oidc-client是一个JavaScrip ...

  7. .NET Core中的性能测试工具BenchmarkDotnet

    背景介绍 之前一篇博客中,我们讲解.NET Core中的CSV解析库,在文章的最后,作者使用了性能基准测试工具BenchmarkDotNet测试了2个不同CSV解析库的性能,本篇我们来详细介绍一下Be ...

  8. RabbitMQ学习笔记(四) Routing

    新的场景 在我们学习了RabbitMQ的发布与订阅之后,我们很容易就可以完成一个简单的消息群发器. 使用这个消息群发器,所有的消费者程序实例都会接收到相同的消息信息,从而实现广播的效果. 但是这种广播 ...

  9. SpringBoot入门教程(十三)CORS方式实现跨域

    什么是跨域?浏览器从一个域名的网页去请求另一个域名的资源时,域名.端口.协议任一不同,都是跨域 . 跨域资源访问是经常会遇到的场景,当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资 ...

  10. python转义字符——重点解释:\b,\n和\r区别

    放在最前面: 有时我们并不想让转义字符生效,我们只想显示字符串原来的意思,这就要用r和R来定义原始字符串.如:print r'\t\r' 实际输出为“\t\r”. 主要参考:AllenW的博客 转义字 ...