java查看sql视图_SQL Server查看视图定义总结

在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可以查看系统视图的定义。

16fd1757e38a581f197a6d2c41c5c453.png

系统视图无法查看对应的系统定义是因为条件限制原因(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

37e98814ecb8626608c3582c10b43a8d.png

a9d721ecc6c6be30e722cd5a0955a070.png

如果你到这一步以为就结束了的话,那么你太天真了。内置函数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

SELECTOBJECT_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数据库

28a0191f32ed30d9c3bbc6e006907c77.png

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

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

cb234b587c664c8b0941924893271e72.png

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中查询MySQL视图,你可以使用JDBC(Java数据库连接)来执行SQL查询语句。下面是一个简单的示例代码: ```java import java.sql.*; public class Main { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/database_name"; String username = "your_username"; String password = "your_password"; try { // 连接数据库 Connection conn = DriverManager.getConnection(url, username, password); // 创建Statement对象 Statement stmt = conn.createStatement(); // 执行查询语句 String sql = "SELECT * FROM your_view_name;"; ResultSet rs = stmt.executeQuery(sql); // 处理查询结果 while (rs.next()) { // 获取视图中的列数据 String column1 = rs.getString("column1"); int column2 = rs.getInt("column2"); // 其他列... // 打印结果 System.out.println(column1 + ", " + column2); } // 关闭连接 rs.close(); stmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } ``` 在上述代码中,你需要将`url`、`username`和`password`替换为你的MySQL数据库的连接信息。然后,使用`DriverManager.getConnection()`方法获取数据库连接。创建`Statement`对象并执行查询语句。使用`ResultSet`迭代结果集并获取视图中的列数据。最后,记得关闭连接。 请注意,这只是一个简单的示例,你需要根据实际情况进行适当的错误处理和异常处理。另外,确保已经导入正确的JDBC驱动程序,例如MySQL Connector/J。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值