1、sql server查看可编程对象定义的方式对比
 
上一篇博文重构sql server的sys.helptext存储中写了sys.helptext的限制和输出格式每行自带char(13)和char(10)这两个字符。为了将可编程对象定义查询方式研究透彻,以下表格列出了查询可编程对象定义的不同方式的却别和对可编程对象定义查看的支持程度。
对象类型描述 对象类型简写
sys.sp_helptext
sys.sql_modules
sys.system_sql_modules
sys.all_sql_modules
object_definition
CHECK_CONSTRAINT
C
支持 不支持
不支持
不支持
支持
DEFAULT_CONSTRAINT(contraint,stand-alone)
D
支持 支持
不支持
支持
支持
SQL_SCALAR_FUNCTION
FN
支持
支持
支持
支持
支持
SQL_INLINE_TABLE_VALUED_FUNCTION
IF
支持
支持
支持
支持
支持
SQL_STORED_PROCEDURE
P
支持
支持 支持
支持
支持
RULE(old-style,stand-alone)
R
支持
支持
不支持
支持
支持
REPLICATION FILTER PROCEDURE
RF
支持
支持
支持
支持
支持
SQL_TABLE_VALUED_FUNCTION
TF
支持
支持
支持
支持
支持
SQL_TRIGGER
TR
支持(除数据库DDL触发器和服务器触发器外)
支持(除服务器触发器外)
不支持
支持(除服务器触发器外)
支持(除服务器触发器外)
USER_TABLE
U
computed_column
支持
不支持
不支持
不支持
不支持
VIEW
V
支持
支持
支持
支持
支持

注意:

1、带有_modules的是系统提供的目录视图类。
2、sys.sql_modules包括所有用户定义的可编程对象的,当然也不支持计算列和服务器触发器的。
3、sys.system_sql_modules不支持系统定义的类型为C、D、R、TR的对象。
4、sys.all_sql_modules就是sys.sql_modules和sys.system_sql_modules这个视图的并集结果的,当然也不支持系统定义的类型为C、D、R、TR类型的对象。
5、sys.sp_helptext虽然支持以上表格中除数据库DDL触发器和服务器触发器之外的可编程对象,但是其输出格式有限制:1、每行最多225双字节字符号,这样有可能造成输出将一个标识符分割为前后两行的。
6、object_definition函数支持以上表格中除服务器除触发器和计算列外的可以变成对象。
7、sys.sp_helpttext和object_definition有个功能的限制:1、在SSMS客户端中如果使用字符串类型变量接收返回的而结果,有可能受制于SSMS客户端针对字符串变量的最大限制(sql server 2012中的最大限制是43679双字节字符长度)不能全部输出到客户端,这个缺点可以从通过程序编码实现得到完美体现。
 
2、整合实现所有可编程对象定义的查看功能的存储dbo.usp_helptext2
 
通过以上几种方式的对比,我们可以看到那个方式都不能将以上表格中列出的对象类型的定义全部都满足,为了解决这个不足,我们将整合这些功能来封装在一个存储(其名称为dbo.usp_helptext2)。需要注意的一点就是服务器触发器本来不是某个数据库中的对象的,服务器触发器和数据库中可编程对象分开更好的理解,也能简单些的,不过为了查询的便利性,我们这次封装的存储实现服务器触发器定义查看。
 
功能整合的存储过程T-SQL代码如下:
IF OBJECT_ID(N'[dbo].[usp_helptext2]', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE [dbo].[usp_helptext2];
END
GO --==================================
-- 功能: 查看可编程对象定义
-- 说明: 支持用户定义类型,可以运行于SQL Server 2005+
-- 创建: yyyy-MM-dd hh:mm-hh:mm XXX 创建内容描述
-- 修改: yyyy-MM-dd hh:mm-hh:mm XXX 修改内容描述
--==================================
CREATE PROCEDURE [dbo].[usp_helptext2]
(
@nvcObjectName AS NVARCHAR(776) -- 对象名称,可以支持的对象类型为(C、D、FN、IF、P、R、RF、TF、TR、U、V)
,@nvcComputedColumnName AS NVARCHAR(128) = NULL -- 计算列名称(如果@nvcObjectName的对象类型为U,则该参数表示计算列名称)
)
AS
BEGIN
SET NOCOUNT ON; SET @nvcObjectName = ISNULL(@nvcObjectName, N'');
IF (@nvcObjectName = N'')
BEGIN
RAISERROR(16902, -1, -1,N'usp_helptext2', N'@nvcObjectName');
RETURN(1);
END SET @nvcComputedColumnName = ISNULL(@nvcComputedColumnName, N''); DECLARE @tntRetVal AS TINYINT;
SET @tntRetVal = 0; DECLARE @tblObjDef AS TABLE (
[Text] NVARCHAR(1000) NULL
); DECLARE
@intObjectID AS INT
,@chaType AS CHAR(2)
,@nvcText AS NVARCHAR(MAX);
SELECT
@intObjectID = 0
,@chaType = ''
,@nvcText = N'';
SELECT
@intObjectID = [object_id]
,@chaType = [type]
FROM [sys].[all_objects]
WHERE
[type] IN ('C', 'D', 'FN', 'IF', 'P', 'R', 'RF', 'TF', 'TR', 'U', 'V')
AND [name] = PARSENAME(@nvcObjectName, 1); IF (@nvcComputedColumnName > N'') -- 获取计算列定义
BEGIN
IF (@chaType NOT IN ('S', 'U', 'TF'))
BEGIN
RAISERROR(15218, -1, -1, @nvcObjectName);
RETURN(1);
END INSERT INTO @tblObjDef ([Text])
EXEC [sys].[sp_helptext]
@objname = @nvcObjectName -- nvarchar(776)
,@columnname = @nvcComputedColumnName -- sysname IF(@@ROWCOUNT = 0)
BEGIN
SET @tntRetVal = 1;
END SELECT
@nvcText = ISNULL([Text], N'')
FROM @tblObjDef;
END
ELSE IF (@intObjectID <> 0) -- 获取除计算列和服务器触发器以外的所有对象类型的定义
BEGIN
SET @nvcText = OBJECT_DEFINITION(@intObjectID); IF(@@ROWCOUNT = 0)
BEGIN
SET @tntRetVal = 1;
END
END
ELSE IF (@intObjectID = 0) -- 尝试获取服务器触发器定义
BEGIN
SELECT
@nvcText = T1.[definition]
FROM [sys].[server_sql_modules] AS T1
INNER JOIN [sys].[server_triggers] AS T2
ON [T1].[object_id] = [T2].[object_id]
WHERE T2.[name] = @nvcObjectName; IF(@@ROWCOUNT = 0)
BEGIN
SET @tntRetVal = 1;
END
END SELECT
@nvcText AS [Text]; RETURN(@tntRetVal);
END
GO
以上存储dbo.usp_helptext2可以完全实现以上表格的所有可编程对象定义查看,不论是系统定义的还是用户定义的,前提是以上表格中的可编程对象类型定义。当然也存在缺点就是可编程对象定义输出到SSMS客户端超过最大限制(SQL Server 2012环境中的时43679双字节字符长度)就要出现截断,这个缺点可以通过代码编程来完美解决这个缺点。
 
3、dbo.helptext2的选择性测试
 
用户定义检查约束测试:
用户定义约束测试:
系统定义存储测试:
用户定义计算列测试:
 
数据库DDL触发器测试
服务器触发器测试:
其他对象类型的测试不在全部列举。
 
4、总结语
 
在这次的学习和研究,sql server系统自带的视图以及存储过程针对可编程对象的实现很很完善的,不过叶分散在不同的地方,这次整合也就是将分散在不同地方的聚合在一起提供统一入口来处理。如果不想查看计算列和服务器触发器的定义以外的所有可编程对象类型的定义,建议使用object_definition函数,该函数几乎提供了很完善的功能。这次学习也发现数据库DDL触发器在sys.object是无法查看到的,需要在sys.triggers或sys.all_objects目录视图中查看到,这个也在object_id函数做了限制的。由于服务器触发器本身属于服务器的,这个sql server团队本身也是用了系统表sys.sysschobjs、sys.syspalnames 、sys.syspalvalues,虽然sys.all_objects也是用了系统表sys.syscheobjs,但是却在sys.all_objects中无法查询到的,也在object_id函数中做了限制,只能在sys.server_triggers查询到,这从逻辑上进行了分离,也符合服务器触发器的归属性质。
 
希望这个整合的查看可编程对象定义的存储,可以帮助到需要的人。继续精进,继续探究sql server。
 
5、参考清单列表

sql server查询可编程对象定义的方式对比以及整合的更多相关文章

  1. SQL Server 查询性能优化 相关文章

    来自: SQL Server 查询性能优化——堆表.碎片与索引(一) SQL Server 查询性能优化——堆表.碎片与索引(二) SQL Server 查询性能优化——覆盖索引(一) SQL Ser ...

  2. Sql Server查询性能优化之走出索引的误区

    据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会.也什么没有必要去关心.了解索引,实在哪天某个查询太慢了找到查询条件建个索引就ok,哪天又有个查询慢了,再建立个索引就是, ...

  3. SQL Server 查询分析器提供的所有键盘快捷方式(转)

    下表列出 SQL Server 查询分析器提供的所有键盘快捷方式. 活动 快捷方式 书签:清除所有书签. CTRL-SHIFT-F2 书签:插入或删除书签(切换). CTRL+F2 书签:移动到下一个 ...

  4. 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

    如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...

  5. SQL Server 查询分析器键盘快捷方式

    下表列出 SQL Server 查询分析器提供的所有键盘快捷方式. 活动 快捷方式 书签:清除所有书签. CTRL-SHIFT-F2 书签:插入或删除书签(切换). CTRL+F2 书签:移动到下一个 ...

  6. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

  7. 用SQL Server查询所有数据并显示

    利用SQL Server查询数据,并把所有数据显示在页面上. "%> <%@page import="jdbc.sqlServer"%> <%@p ...

  8. SQL Server查询性能

    sql server常用语句总结 http://ace105.blog.51cto.com/639741/792519 SQL Server 性能调优(一)--从等待状态判断系统资源瓶颈        ...

  9. [转] 利用SET STATISTICS IO和SET STATISTICS TIME 优化SQL Server查询性能

    首先需要说明的是这篇文章的内容并不是如何调节SQL Server查询性能的(有关这方面的内容能写一本书),而是如何在SQL Server查询性能的调节中利用SET STATISTICS IO和SET ...

随机推荐

  1. C#多线程之线程池篇3

    在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...

  2. CSS 3学习——文本效果和@font-face

    文本效果 关于文本效果,这里仅仅记录得到大多数浏览器支持的几个属性,分别是: text-overflow text-shadow word-break word-wrap text-overflow ...

  3. PHP获取客户端IP

    /** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...

  4. 14门Linux课程,打通你Linux的任督二脉!

    Linux有很多优点:安全.自主.开源--,也正是这些优点使得很多人都在学Linux. 虽说网上有大把的Linux课程资源,但是对很多小白来说网上的课程资源比较零散并不适合新手学习. 正因为此,总结了 ...

  5. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  6. 如何区别exists与not exists?

    1.exists:sql返回结果集为真:not exists:sql不返回结果集为真.详解过程如图: exists not exists

  7. 不要着急改代码,先想想--centos 6.8下编译安装tmux

    诸位读者新年好,2017开年第一篇博客,请允许我先问候一下看到这篇博客的诸位.写博客是我2017年定下的目标之一,希望我会坚持下去. 最近打算尝试一下tmux这个神器,于是有了这一篇关于思维方式的Bl ...

  8. iOS9支付宝无法调起客户端

    1.为了适配 iOS9.0 中的 App Transport Security(ATS)对 http 的限制,这里需要对 支付宝的请求地址 alipay.com 做例外,在 app 对应的 info. ...

  9. 机器指令翻译成 JavaScript —— No.5 指令变化

    上一篇,我们通过内置解释器的方案,解决任意跳转的问题.同时,也提到另一个问题:如果指令发生变化,又该如何应对. 指令自改 如果指令加载到 RAM 中,那就和普通数据一样,也是可以随意修改的.然而,对应 ...

  10. Ubuntu Server(Ubuntu 14.04 LTS 64位)安装libgdiplus2.10.9出错问题记录

    首先下载libgdiplus2.10.9安装包 wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.t ...