星期五, 5月 30, 2014

[SQL] 伺服器組態選項

伺服器組態選項就是 SQL Server instance 屬性。
  • 介面組態區
在 SQL Server 2005 是在 SQL Server 介面組態區進行設定,SQL Server 2008 開始則是整合在 instance Facet 中。
    2005 畫面
[SQL] 伺服器組態選項-5
    2012 畫面
[SQL] 伺服器組態選項-6

星期一, 5月 26, 2014

[VS] 括號

寫 Code 時,常常會用到 { } 區塊,萬一 { } 區塊內容很長,常常不容易找到相對應的括號,下面紀錄兩種方式來輔助尋找
  • Visual Studio 快捷鍵
在左括號旁(下圖第 74 行),使用 Ctrl + } 就會到跳到右括號上(下圖第 84 行),左右括號還會 Highlight 顯示(如下圖)

[VS] 括號-4
  • Indent Guides 套件
此套件會利用垂直線來顯示左括號和右括號,方便辨識括號範圍

套件效果
[VS] 括號-1

星期五, 5月 23, 2014

[SQL] SQL Server 啟動時間

記錄查詢 SQL Server 啟動時間的方法:

1. SQL Server 2005 以上版本,利用 TempDB 建立時間來判斷
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]
3. SQL Server 2012 以上版本,利用 sys.dm_server_services
SELECT
	ServiceName ,
	Last_Startup_Time
FROM sys.dm_server_services
4. SSMS 報表 - 伺服器儀錶板




5. 利用 sp_procoption 搭配 Database Mail 來偵測 SQL Server 啟動時間,詳見 [SQL] sp_procoption
-- 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 通知囉

星期三, 5月 21, 2014

[C#] 跳躍陳述式

C# 中的跳躍陳述式分別為 break、continus、goto 和 return
MSDN 說明:
  • break:終止它所在之最靠近的封閉式迴圈或 switch 陳述式。 程式控制權轉移到終止陳述式之後的陳述式 (如果有的話)。
  • continus:將程式控制權轉移到它所在之封閉反覆運算陳述式 (Iteration Statement) 的下一個反覆運算。
  • goto:
    • goto 陳述式將程式控制直接轉移到標記陳述式。
    • goto 的常見用法是轉移控制至特定的 switch-case 標記或 switch 陳述式中預設的標記。
    • goto 陳述式對於跳出複雜的巢狀迴圈也很有用。
  • return: return 陳述式終止其所在處之方法的執行,並且轉移程式控制權至呼叫的方法

星期六, 5月 17, 2014

[C#] 搜尋特定文字結尾資料夾

論壇問題,希望可以找出特定文字結尾資料夾並在 ListBox 中列出來

[C#] 搜尋特定文字結尾資料夾

星期五, 5月 16, 2014

[SQL] DATEDIFF 回傳值

論壇問題,利用 DATEDIFF() 計算兩個時間區間秒數時,發生下列的錯誤訊息
DATEDIFF 函數造成溢位。分隔兩個日期/時間執行個體的日期部分數目太大。請嘗試使用日期部分較不精確的 DATEDIFF
發生原因:
DATEDIFF() 回傳值為 int,範圍為 -2,147,483,648 到 +2,147,483,647,換算成秒的話,最大差異是 68 年,因此起始日期和結束日期超過 68 年,就會出現上述的錯誤訊息。

解決方法:
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
  • Step1:利用 CONVERT() 把日期轉為ODBC標準(120)的字元日期,並利用 char(16) 限定字元,來進行捨去秒數的行為,起始日期捨去秒數為 S、結束日期捨去秒數為 E。
  • Step2:
    1. 計算 S 和 E 相差多少分鐘,而 1 分鐘 = 60 秒,就可以計算出多少秒數,也避開 DATEDIFF() 回傳值的限制
    2. 起始日期捨去秒,秒數變多,必須把它扣掉,EX:05:00:11 => 05:00:00,減 11 秒
    3. 結束日期捨去秒,秒數變少,必須把它加回,EX:07:10:11 => 07:10:00,加 11 秒
下圖是把 Step2 圖表化,起始日期和結束日期相差秒數(黃色線)= S、E 秒數差(藍色線)- 起始日期和 S 秒數差(綠色) + 結束日期 和 E 秒數差(褐色線)
[SQL] DATEDIFF 回傳值-4

[SQL] DATEDIFF 回傳值-1

星期四, 5月 15, 2014

Microsoft 帳戶登錄異常

一大早就在 Gmail 內收到 "Microsoft 帳戶登錄異常" 的警告信

MS 帳戶登入異常-1

登入確認最近活動,赫然發現竟然有從美國登錄的記錄,我事業沒有作這麼大,>.<

MS 帳戶登入異常-2

星期日, 5月 11, 2014

[SQL] OUTPUT 語法

SQL Server 2005 功能 - OUTPUT,類似於 Trigger 的概念,可以在增刪修後,透過 inserted 和 deleted 找出增刪修前後的欄位資料

下列在 AdventureWorks 中利用產品(Production)、庫存量(StockQty)和入領料(Stock、StockDetail)來說明 OUTPUT 用法,以 SQL Server 2005 為主
  • 建立基礎 Table 並插入 Sample Data
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

星期一, 5月 05, 2014

Windows XP

重新安裝 Windows XP 時,出現的提醒訊息,公司內工業設備上的 OS,根本沒有辦法更新,最舊的還有 NT4.0,看來 XP 再戰十年是一定要的啦 ~~

Windows XP Expire