- 介面組態區
- 2005 畫面
- 2012 畫面
SELECT
[create_date]
FROM [sys].[databasees]
WHERE [database_id] = 2
2. SQL Server 2008 以上版本,利用 sys.dm_os_sys_info SELECT
[sqlserver_start_time]
FROM [sys].[dm_os_sys_info]
SELECT
ServiceName ,
Last_Startup_Time
FROM sys.dm_server_services
-- Step 1:預存程序只能存在於 master 資料庫
USE master
GO
-- Step 2:判斷欲建立的預存程序是否存在,存在的話則刪除預存程序
IF OBJECT_ID('[dbo].[uspSQLStart]') IS NOT NULL
DROP PROC [dbo].[uspSQLStart]
-- Step 3:預存程序利用 msdb.dbo.sp_send_dbmail 來發信,當然前提是 Database Mail 已經設定好
CREATE PROC [dbo].[uspSQLStart]
AS
DECLARE @Text varchar(512)
SET @Text = 'The SQL Server [' + @@SERVERNAME + '].[' + @@SERVICENAME + '] ' +
'restart at ' + CONVERT(char(19),GETDATE(),120) + '.'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Database Mail Profile' ,
@recipients = '收件者Email' ,
@subject = 'SQL Server 通知 - SQL Server 執行個體已經啟動' ,
@body = @Text ,
@body_format = 'TEXT'
GO
-- Step 4:最後利用 sp_procoption 把預存程序設為自動執行
EXEC sp_procoption N'uspSQLStart' , 'startup' , 'on'
GO
-- Step 5:重新啟動 SQL Server instance 就可以收到 Email 通知囉
MSDN 說明:
- break:終止它所在之最靠近的封閉式迴圈或 switch 陳述式。 程式控制權轉移到終止陳述式之後的陳述式 (如果有的話)。
- continus:將程式控制權轉移到它所在之封閉反覆運算陳述式 (Iteration Statement) 的下一個反覆運算。
- goto:
- goto 陳述式將程式控制直接轉移到標記陳述式。
- goto 的常見用法是轉移控制至特定的 switch-case 標記或 switch 陳述式中預設的標記。
- goto 陳述式對於跳出複雜的巢狀迴圈也很有用。
- return: return 陳述式終止其所在處之方法的執行,並且轉移程式控制權至呼叫的方法
DATEDIFF 函數造成溢位。分隔兩個日期/時間執行個體的日期部分數目太大。請嘗試使用日期部分較不精確的 DATEDIFF發生原因:
DECLARE @Temp TABLE (StartDate datetime,EndDate datetime)
INSERT INTO @Temp VALUES
('1900-05-07 23:59:59','2014-05-07 13:23:10') , -- 秒數破表
('2014-05-06 16:13:45','2014-05-07 20:13:37') ,
('2014-05-06 20:13:32','2014-05-07 03:23:55') ,
('2014-05-07 05:00:11','2014-05-07 07:10:11') -- 下面說明用此資料當成範例
SELECT
T.StartDate ,
T.EndDate ,
FORMAT -- 閱讀方便,沒有計算上的意義
(
-- Step2:數學邏輯運算
CAST(DATEDIFF(mi,T.S,T.E) AS bigint) * 60 -- Step2-1
- DATEDIFF(ss,T.S,T.StartDate) -- Step2-2
+ DATEDIFF(ss,T.E,EndDate) , -- Step2-3
'###,###,###'
) AS TotalSec
FROM
(
SELECT
StartDate ,
EndDate ,
-- Step1:捨去秒數
CAST(CONVERT(char(16),StartDate,120) AS datetime) AS S ,
CAST(CONVERT(char(16),EndDate,120) AS datetime) AS E
FROM @Temp
) AS T
IF OBJECT_ID('StockQty') IS NOT NULL
DROP TABLE StockQty
IF OBJECT_ID('Stock') IS NOT NULL
DROP TABLE Stock
IF OBJECT_ID('StockDetail') IS NOT NULL
DROP TABLE StockDetail
IF OBJECT_ID('Production') IS NOT NULL
DROP TABLE Production
CREATE TABLE Production (ProdID int Primary key, ProdName nchar(50))
INSERT INTO Production VALUES(1,N'SQL Server 2014')
INSERT INTO Production VALUES(2,N'SQL Server 2012')
INSERT INTO Production VALUES(3,N'SQL Server 2008 R2')
INSERT INTO Production VALUES(4,N'SQL Server 2008')
INSERT INTO Production VALUES(5,N'SQL Server 2005')
CREATE TABLE StockQty (ProdID int Primary key, Qty int)
INSERT INTO StockQty VALUES(1,0)
INSERT INTO StockQty VALUES(2,0)
INSERT INTO StockQty VALUES(3,0)
INSERT INTO StockQty VALUES(4,0)
INSERT INTO StockQty VALUES(5,0)
CREATE TABLE Stock (SID int Primary key, [Date] date)
CREATE TABLE StockDetail (SID int Primary key(SID,ProdID), ProdID int , Qty int)
GO