正文:
1、SQL Server系统提供的部分疑惑概述
 
近来工作之余一直在系统地学习和研究SQL Server 数据库引擎这一整块,发现了一些原来没有太注意的东西,感觉SQL Server 光数据库引擎这块就有很多要学习和研究的。我个人觉得SQL Server提供的功能除了bug(可以通过service pack打补丁修复)外,应该还是很值得信赖的。以下发现了如下SQL Server 系统提供功能的三个疑惑:系统函数调用时DEFAULT代替可选参数使用不一致、队列字段列message_enqueue_time记录的是UTC时间和@@Pack_Received系统函数提示信息有错误,以下针对每一个疑惑具体演示和讲解。

2、系统函数调用时DEFAULT代替可选参数使用不统一
 
DEFAULT关键字即可以在DDL语句中定义DEFAULT默认约束,也可以用来代替可选参数来使用。在DEFAULT代替可选参数使用这一点上,在功能上和NULL具有相同的效果。
 
在SQL Server系统提供的动态管理对象中,尤其动态管理函数的调用时,将可选参数代替为NULL或DEFAULT效果一样的。如下T-SQL代码:
SELECT *
FROM [sys].[dm_db_index_physical_stats](NULL, NULL, NULL, NULL, NULL);
GO SELECT *
FROM [sys].[dm_db_index_physical_stats](DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
GO
针对以上T-SQL的测试结果如下截图:
 
 
其他类型的系统函数,有些函数在可选参数代替NULL或DEFAULT效果也是一样的,有fn_trace_getinfo、fn_trace_gettable等。如以下T-SQL代码:
 
DECLARE @nvcDefaultTraceFilePath AS NVARCHAR(4000);
SET @nvcDefaultTraceFilePath = N''; SELECT @nvcDefaultTraceFilePath = [path]
FROM [sys].[traces]
WHERE [id] = 1; SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, NULL); SELECT *
FROM ::fn_trace_gettable(@nvcDefaultTraceFilePath, DEFAULT);
GO
针对以上T-SQL的测试结果如下截图:
 
在其他类型系统函数中,更多的时候在可选参数代替NULL或DEFAULT在效果上是不一样的,有fn_virtualfilestats等。如下T-SQL代码:
SELECT *
FROM ::fn_virtualfilestats(1, NULL); SELECT *
FROM ::fn_virtualfilestats(1, DEFAULT);
针对以上T-SQL测试的结果如下截图:
 
3、队列字段列message_enqueue_time记录的是UTC日期时间
 
学习和研究service broker时,发现了从服务队列中字段列message_enqueue_time值缺失UTC日期时间。
 
在系统数据库tempdb中演示获取创建表的事件通知的效果。如下T-SQL代码:
USE [tempdb];
GO -- 创建队列
IF OBJECT_ID(N'[dbo].[NotifyQueue]', 'SQ') IS NULL
BEGIN
CREATE QUEUE [dbo].[NotifyQueue]
WITH
STATUS = ON
,RETENTION = OFF
END
GO -- 创建服务
IF NOT EXISTS (SELECT 1 FROM [sys].[services] WHERE [name] = N'EventNotifyService')
BEGIN
CREATE SERVICE [EventNotifyService]
ON QUEUE [dbo].[NotifyQueue] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
END
GO -- 创建路由
IF NOT EXISTS (SELECT 1 FROM [sys].[routes] WHERE [name] = N'NotifyRoute')
BEGIN
CREATE ROUTE [NotifyRoute]
WITH
SERVICE_NAME = N'EventNotifyService'
,ADDRESS = N'LOCAL';
END
GO -- 创建事件通知
IF NOT EXISTS (SELECT 1 FROM [sys].[event_notifications] WHERE [name] = N'CreateTableNotification')
BEGIN
CREATE EVENT NOTIFICATION [CreateTableNotification]
ON DATABASE
FOR CREATE_TABLE
TO SERVICE 'EventNotifyService', 'current database';
END
GO
创建表的 T-SQL脚本如下:
IF OBJECT_ID(N'[dbo].[TableCreate]', 'U') IS NULL
BEGIN
CREATE TABLE [dbo].TableCreate
(
Col1 INT
,Col2 VARCHAR(100)
,Col3 XML
)
ON [PRIMARY]
END
GO
从刚才创建的服务队列中获取列表的T-SQL代码如下:
SELECT
CAST([message_body] AS XML)
,message_enqueue_time
,*
FROM [dbo].NotifyQueue
GO
针对以上T-SQL测试的如下图:
 
以上截图中两个红色矩形框圈住的地方,显然日期时间相差很大的,这是因为队列中的字段列message_enqueue_time记录的是UTC日期时间,这样就可能对展示造成迷惑的。
 
注意:
以上演示的T-SQL代码很大部分摘录于SQL Server 2012 管理高级教程(第2版)中第12章12.4.4事件通知小节中的程序清单 12-3 CreateQueue.sql。
 
4、@@Pack_Received系统函数提示有错误
 
在逐个梳理SQL Server系统提供的系统函数时发现了@@Pack_Received和@@Packet_Errors具有相同的提示信息。可以确定一定有一个是错误的。提示信息的演示如截图:


 
5、总结语
 
近来整体概要地了解和学习了SQL Server 数据库引擎这块的知识,感觉还是要继续深入学习 和研究。在深入过程中发现了以上SQL Server系统提供功能的3个疑惑。针对系统函数调用时DEFAULT代替可选参数不统一的疑惑尽量使用NULL,少用DEFAULT。针对服务队列中字段列message_enqueue_time为何保存UTC日期时间目前依然不明白,研究了很多sql server系统数据库、示例数据库很少使用UTC日期时间值的,也请知道的同仁告知,万分感谢。
 
很久很久没有更新博文了,主要原因还是太懒,读、写和说都是必备的基本技能的,写和说这两个基本技能继续提升加强。今晚正好元宵节,也祝福各位元宵节快乐,阖家欢乐。新的一年从今天开始,继续踏上征程:撸起袖子加油干。

6、参考清单列表
1、SQL Server 2012 管理高级教程(第2版)中第12章12.4.4事件通知小节中的程序清单 12-3 CreateQueue.sql。
 
 

(原)SQL Server 系统提供功能的三个疑惑的更多相关文章

  1. Sql Server 系统表功能

    SELECT Name FROM Master..SysDatabases ORDER BY Name

  2. SQL Server系统函数简介[转]

    一.字符转换函数1.ASCII()返回字符表达式最左端字符的ASCII 码值.在ASCII()函数中,纯数字的字符串可不用‘’括起来,但含其它字符的字符串必须用‘’括起来使用,否则会出错.2.CHAR ...

  3. SQL Server系统表介绍与使用

    关于SQL Server数据库的一切信息都保存在它的系统表格里.我怀疑你是否花过比较多的时间来检查系统表格,因为你总是忙于用户表格.但是,你可能需要偶尔做一点不同寻常的事,例如数据库所有的触发器.你可 ...

  4. SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型

    原文:SQL Server 2008空间数据应用系列三:SQL Server 2008空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server ...

  5. sql server系统存储过程大全

    关键词:sql server系统存储过程,mssql系统存储过程 xp_cmdshell --*执行DOS各种命令,结果以文本行返回. xp_fixeddrives --*查询各磁盘/分区可用空间 x ...

  6. 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色

    简介 在简单恢复模式下,日志文件的作用仅仅是保证了SQL Server事务的ACID属性.并不承担具体的恢复数据的角色.正如”简单”这个词的字面意思一样,数据的备份和恢复仅仅是依赖于手动备份和恢复.在 ...

  7. SQL Server 系统数据库

    Sql Server的系统数据库分为:master.model.msdb,resouce和tempdb,这五个数据库在SQL Server中各司其职,作为研发人员,很有必要了解这几个数据库的职责,下面 ...

  8. SQL Server 2014新功能PPT

        本篇文章是我在公司内部分享SQL Server 2014新功能的PPT,在本PPT中我详细描述了SQL Server除了BI方面的新功能,以及提供了大量的测试.希望对大家有帮助.     请点 ...

  9. SQL Server 系统视图

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

随机推荐

  1. 蘑菇街teamtalk简介

    这几天在看蘑菇街实时通讯程序teamtalk的安卓端代码.现在对程序的大概情况进行简单的介绍. 蘑菇街的teamtalk开源项目包含了服务器端,Android客户端和iPhone客户端的程序.想要进行 ...

  2. AWK第一篇------全面介绍

    AWK-文本流编辑器 目录 [隐藏] 1 命令行语法 2 用shell实现调用awk 3 awk语言概要 3.1 记录和字段 3.2 脚本的格式 3.3 行为终止 3.4 注释 3.5 模式 3.6  ...

  3. OPENCV之GFTT特征点检测

    之前角点检测的时候提到过角点检测的算法,第一个是cornerHarris计算角点,但是这种角点检测算法容易出现聚簇现象以及角点信息有丢失和位置偏移现象,所以后面又提出一种名为 shi_tomasi的角 ...

  4. EnablePrefetcher注册表项的修改与电脑提速

    前些天在图书馆找教材,偶然发现一本windows dos命令应用技巧的书,发现了几个有用的注册表项 EnablePrefetcher这个注册表项是windows用来控制系统预读取数据开放程度的参数,其 ...

  5. STM8的GPIO驱动

    芯片的外设一般按照这么几个流程来进行,GPIO,外部中断,定时器,串口,ADC,IIC,SPI,下面我就按照各个模式来写 首先是GPIO,STM8的GPIO拥有复用功能,这句话告诉我们必然需要配置IO ...

  6. 关于Java在Linux or Android平台调用.so库

    Linux平台Java调用so库-JNI使用例子 android NDK开发及调用标准linux动态库.so文件 在Android项目中调用已有.so库 Android 调用.so文件 jni And ...

  7. UVa 10176 - Ocean Deep ! - Make it shallow !!

    题目大意:判断一个很大的二进制能否被131071整除.在二进制转十进制的过程中不断取模,最后判断结果是否是0就可以了. #include <cstdio> #include <cst ...

  8. 获取IE浏览器关闭事件

    //关闭浏览器时才会触发此操作,刷新页面不执行 //n 检测鼠标相对于用户屏幕的水平位置 - 网页正文部分左:求出鼠标在当前窗口上的水平位置(参照:当前窗口右上角为0.0坐标) //m 网页正文全文宽 ...

  9. 一句话绑定父函数的作用域this

    //如何在返回的函数中绑定父函数的作用域this function bound () { return function () { console.log(this); }.bind(this); } ...

  10. Web开发者应当开始学习HTML5的新功能

    据国外媒体报道,谷歌开发者业务部门高管马克·皮尔格雷姆(Mark Pilgrim)在WWW2010会议上表示,尽管还需要进一步完善,HTML5已经获得大多数平台支持,适合完成大多数任务. 但并非所有人 ...