做了一个如下的小厕所,如果我需要得到返回是 d,f 那我需要用那组语句呢?

    编程执行Sql语句难免忘记保存执行的文本,或是意外设备故障多种情况的发生。对于写的简单的Sql语句丢了就丢了,但对于自己写的复杂的丢失就有些慌了,

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

A:

  有时候很难再次写出来,这时候就需要用一些方法找回Sql语句,下面的方法只适合MS
SQLServer:

 

;WITH CA AS(
SELECT *
    FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
    FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
SELECT * FROM CA
EXCEPT SELECT * FROM CB
UNION 
SELECT * FROM CB
EXCEPT SELECT * FROM CA

    SELECT TOP 1000 

1:使用SQL
Server Management Studio(SSMS)

B:

*    –创建时间
    QS.creation_time,
    –查询语句
    SUBSTRING(ST.text,(QS.statement_start_offset/2)+1,
    ((CASE QS.statement_end_offset WHEN -1 THEN
DATALENGTH(st.text)
    ELSE QS.statement_end_offset END –
QS.statement_start_offset)/2) + 1
    ) AS statement_text,
    –执行文本
    ST.text,
    –执行计划
    QS.total_worker_time,
    QS.last_worker_time,
    QS.max_worker_time,
    QS.min_worker_time
    FROM
    sys.dm_exec_query_stats QS
    –关键字
    CROSS APPLY
    sys.dm_exec_sql_text(QS.sql_handle) ST
    ORDER BY
    QS.creation_time DESC
    参考:*

 

;WITH CA AS(
SELECT *
    FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
    FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
SELECT * FROM CA
EXCEPT SELECT * FROM CB
UNION 
(SELECT * FROM CB
EXCEPT SELECT * FROM CA)

        
 

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

 C:

 

;WITH CA AS(
SELECT *
    FROM (VALUES('a'),('b'),('c'),('d'))a (A))
,CB AS (
SELECT *
    FROM (VALUES('a'),('b'),('c'),('f'))a (A)
)
(SELECT * FROM CA
EXCEPT SELECT * FROM CB)
UNION 
(SELECT * FROM CB
EXCEPT SELECT * FROM CA)

 

 

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

 实际情况执行一下就知道,其实BC
的语句都可以执行。而A的执行情况就是只返回了 d。这个其实是跟select
的执行顺序有关的。

 

通常我们看select
的执行顺序的时候,可能会忽略这2个不常用的连接谓词导致误判。这里做一个实验就可以发现,其实 Except(Intersect
同理) 的查询优先级是和 union 或者union all 是同级的。

 

所以遵循从左到右的顺序,如果不用括号改变执行顺序,从上面的例子,将会返回
 CA Except CB -> Union CB -> Except CA
的执行结果。也就是一个容易忽略的位置。

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

因为比较少用,所以我也躺枪了。在此分享一波,希望大家不要踩坑。

 

PS

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 select 执行顺序的地址

 

2 Except 和 Intersect 都是返回交叉之后不重复的结果的,这个需要特别注意

 

 

 

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

 

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

 

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

 

   
澳门微尼斯人手机版 1

发表评论

电子邮件地址不会被公开。 必填项已用*标注