本文目錄列表: 1、SQL Server系統提供的部分疑惑概述2、系統函數調用時DEFAULT代替可選參數使用不統一3、隊列欄位列message_enqueue_time記錄的是UTC日期時間 本文目錄列表: 1、SQL Server系統提供的部分疑惑概述2、系統函數調用時DEFAULT代替可選參數 ...
本文目錄列表: 1、SQL Server系統提供的部分疑惑概述
2、系統函數調用時DEFAULT代替可選參數使用不統一
3、隊列欄位列message_enqueue_time記錄的是UTC日期時間 4、@@Pack_Received系統函數提示信息有錯誤 5、總結語
6、參考清單列表 正文: 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。