2015-12-30

日期時間資料類型:ISNULL函數、IS [NOT] NULL 述詞,對時間值是 NULL 時的處理方式是不同的



SQL Server 的日期時間類型,例如有:datetimeoffset、datetime2、smalldatetime、datetime等。

若輸入資料值時,僅輸入日期值,卻未提供時間值時,系統自動以 1900-01-01 00:00:00.000,午夜零點零分零秒的方式來呈現。

這對 ISNULL函數、IS [NOT] NULL 述詞,在處理這類資料值時,就會有不同的行為。




請參考以下的範例:

USE tempdb
GO
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[atb01]') AND type in (N'U'))
 BEGIN
  DROP TABLE [dbo].[atb01]
  CREATE TABLE [dbo].[atb01](
 [Sid] [int] PRIMARY KEY,
 [Aircode] [varchar](50) NULL,
 [Edate] [datetime] NULL)
 END
ELSE 
BEGIN
 CREATE TABLE [dbo].[atb01](
 [Sid] [int] PRIMARY KEY,
 [Aircode] [varchar](50) NULL,
 [Edate] datetime NULL)
END
GO

-- 新增四筆資料列
INSERT atb01 VALUES(1, 'A201',GETDATE())
INSERT atb01 VALUES(2, 'A202', '1900/01/01') -- 只給日期,未給時間。資料類型:[datetime]。
INSERT atb01(Sid, Aircode) VALUES(3,'A203')
INSERT atb01(Sid, Aircode) VALUES(4,'A204')
GO

-- 00 有 4 筆資料列
/*
已知:第二筆資料列,Edate資料行的資料類型是:[datetime]。
只輸入日期,未給時間。

查詢時,可觀察到,系統自動以 1900-01-01 00:00:00.000,午夜零點零分零秒的方式來呈現。
由於未提供時間值,仍是 NULL。
*/

SELECT Sid, Aircode, Edate FROM atb01



- 01_範例資料表,有4筆資料列







01 使用 ISNULL() 函數,3 筆資料列

-- 01 使用 ISNULL() 函數,3 筆資料列




/*
ISNULL 函數:以指定的取代值來取代 NULL。

使用 ISNULL() 函數,將會抓取到  3 筆資料列,包含:兩筆未提供任何值,以及一筆僅提供日期值的資料列。
*/

SELECT Sid, Aircode, Edate FROM atb01
WHERE ISNULL(Edate,'') = ''


-- 02_使用 ISNULL() 函數,抓到3筆資料列






02 使用 IS NULL 述詞,2 筆資料列



-- 02 使用 IS NULL 述詞,2 筆資料列 
/*

IS [NOT] NULL 述詞:判斷指定的運算式是否為 NULL。
若使用 IS [NOT] NULL 述詞來判斷 Edate 資料行是否為 NULL,將會抓取到 2 筆資料列。
*/

SELECT Sid, Aircode, Edate FROM atb01
WHERE Edate IS NULL



-- 03_IS [NOT] NULL 述詞,抓到2筆資料列






有些專案在設計時,若沒有輸入

1. 若沒有輸入日期時間時,前端程式將自動輸入 1900/01/01。
2. 後續接手的人員,可能改變此規則,改採取不輸入,讓系統存放 NULL 值,這又會是另一套規則。

或許,在某些狀況下, NULL 與 1900/01/01,對於此專案是具相同的意義。
但使用 ISNULL 函數與 IS NULL 述詞,卻是取得不同的結果。

若能修改原始資料值,具備一致的特性,則在 WHERE 條件式就可以精簡許多,也有機會可以使用索引來提升查詢效能。




ISNULL 函數

ISNULL 函數:以指定的取代值來取代 NULL。

語法:
ISNULL ( check_expression , replacement_value )

check_expression
這是要檢查 NULL 的運算式。check_expression 可以是任何類型。

replacement_value
這是 check_expression 是 NULL 時所傳回的運算式。replacement_value 必須是能夠隱含地轉換成 check_expresssion 類型的類型。




IS [NOT] NULL 述詞

判斷指定的運算式是否為 NULL。

語法:
expression IS [ NOT ] NULL

引數

expression
這是任何有效的運算式。

NOT
指定執行布林結果的否定運算。 這個述詞會反轉它的傳回值,如果值不是 NULL,就傳回 TRUE,如果值是 NULL,就傳回 FALSE。

結果類型 Boolean

傳回碼值
如果 expression 的值是 NULL,IS NULL 會傳回 TRUE;否則,它會傳回 FALSE。
如果 expression 的值是 NULL,IS NOT NULL 會傳回 FALSE;否則,它會傳回 TRUE。

備註
若要判斷運算式是否為 NULL,請利用 IS NULL 或 IS NOT NULL 來取代比較運算子 (如 = 或 !=)。
當兩個引數或其中一個引數是 NULL 時,比較運算子會傳回 UNKNOWN。



參考資料

SQL Server:認識 ISNULL 函數
http://sharedderrick.blogspot.tw/2012/06/t-sql-isnull.html

ISNULL (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms184325(v=sql.120).aspx

資料類型 (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms187752(v=sql.120).aspx

IS [NOT] NULL (Transact-SQL)
https://msdn.microsoft.com/zh-tw/library/ms188795(v=sql.120).aspx

2015-12-24

執行個體的服務啟動帳戶(NT SERVICE\MSSQLSERVER),應該具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限

示範環境:
1. SQL Server 2014
2. 作業系統:Windows 10 與 Windows Server 2012 R2

以存取磁碟的效能來考量

執行個體的服務啟動帳戶,預設是使用「虛擬帳戶」:NT SERVICE\MSSQLSERVER,應該具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限。

依據預設值,是沒有具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限,請參考以下的示範:

建立資料庫:Instant01,資料檔案的初始值大小是:512 MB。

-- 01_建立範例資料庫


-- 02_未具備-執行磁碟區維護工作



建立此資料庫,需要費時:9,869 ms。




若服務啟動帳戶具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限,請參考以下的範例:

-- 03_已具備-執行磁碟區維護工作



建立資料庫,需要費時:778 ms。



測試結果

9,869 ms(預設值) 比上 778 ms(調整後),兩者差距:9,091 ms。



設定具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限

-- 04_使用 Local Security Policy



-- 05_設定具備「執行磁碟區維護工作(Perform volume maintenance tasks)」安全性原則的權限



-- 06_檢視_Perform volume maintenance tasks



中文版本

-- 07__使用-本機安全性原則



-- 08_找到多個相符合名稱



-- 09_設定具備-磁碟區維護工作



-- 10_檢視_磁碟區維護工作





立即檔案初始化(Instant File Initialization)

在 SQL Server 2005 及更新的版本中,可將資料檔立即初始化,以便快速執行資料庫或檔案群組的還原作業。

立即檔案初始化會回收使用過的磁碟空間,但不以零填滿該空間。而是在將新資料寫入檔案時,覆寫磁碟內容。

雖然記錄檔初始化仍然需要歸零,不過這項作業可以跟備份的資料傳輸作業平行進行。還原的向前復原步驟則要等到所有資料都已經傳輸而且整個記錄都已經初始化才會啟動。

附註附
立即檔案初始化僅適用於 Microsoft Windows XP、Windows Server 2003 或更新版本的系統。

若要使用立即檔案初始化,您必須在 Windows 帳戶之下執行 MSSQLSERVER 服務帳戶,並指派 Windows SE_MANAGE_VOLUME_NAME 特殊權限給該 Windows 帳戶。

此權限依預設會指定給 Windows Administrators 群組。

若您有系統管理員權限,即可將 Windows 帳戶新增至「執行磁碟區維護工作」安全性原則,藉以指派此權限。



Windows 7 和 Windows Server 2008 R2 中提供的新帳戶類型

Windows 7 和 Windows Server 2008 R2 有兩種新的服務帳戶類型,分別稱為「受管理的服務帳戶」(Managed Service Account,MSA) 和「虛擬帳戶」(Virtual Account)。

受管理的服務帳戶和虛擬帳戶的設計在於提供重要的應用程式 (例如 SQL Server) 並與自己的帳戶隔離,同時不需系統管理員手動管理服務主要名稱 (SPN) 和這些帳戶的認證。

這些帳戶可讓長期管理服務帳戶使用者、密碼和 SPN 的工作更輕鬆。

虛擬帳戶(Virtual Accounts)

Windows Server 2008 R2 和 Windows 7 中的虛擬帳戶是「受管理的本機帳戶」(Managed Local Account),會提供下列功能來簡化服務管理工作。

虛擬帳戶是自動管理的,而且虛擬帳戶可以在網域環境中存取網路。

如果在 Windows Server 2008 R2 或 Windows 7 上安裝 SQL Server 的期間針對服務帳戶使用預設值,則會使用以執行個體名稱做為服務名稱的虛擬帳戶,其格式為 NT SERVICE\。 

以虛擬帳戶執行的服務,會利用電腦帳戶的認證存取網路資源,其格式為 \$。 

指定虛擬帳戶啟動 SQL Server 時,請讓密碼空白。 如果虛擬帳戶無法註冊服務主要名稱 (SPN),請手動註冊 SPN。

注意事項

虛擬帳戶無法用於 SQL Server 容錯移轉叢集執行個體,因為虛擬帳戶在叢集的每一個節點上不會有相同的 SID。



執行磁碟區維護工作(Perform volume maintenance tasks)

此安全性原則設定會決定哪些使用者可以執行磁碟區或磁碟管理工作,例如重組現有的磁碟區、 建立或移除磁碟區,以及執行磁碟清理工具。

指派此使用者權限時請特別小心。
這個使用者權限的使用者可以瀏覽磁碟並擴充匯入包含其他資料的記憶體。

擴充的檔案開啟時,使用者可能可以讀取和修改取得的資料。




參考資料

執行磁碟區維護工作
https://technet.microsoft.com/zh-tw/library/dn221971.aspx

最佳化 SQL Server 中的備份和還原效能
https://technet.microsoft.com/zh-tw/library/ms190954(v=sql.105).aspx

設定 Windows 服務帳戶與權限
https://msdn.microsoft.com/zh-tw/library/ms143504(v=sql.120).aspx

執行磁碟區維護工作
https://technet.microsoft.com/zh-tw/library/dn221971.aspx

2015-12-22

Windows 8, Windows 10 需自行新增「SQL Server 組態管理員」


適用環境:

  1. 作業系統:Windows 8, Windows 8.1, Windows 10
  2. SQL Server 版本:SQL Server 2012、SQL Server 2014 

由於 SQL Server 組態管理員是 Microsoft Management Console 程式的內嵌式管理單元,而不是獨立的程式,因此 SQL Server 組態管理員不會在執行 Windows 8 時做為應用程式出現。

若要開啟 SQL Server 組態管理員,在 [搜尋] 快速鍵的 [應用程式] 下,輸入 SQLServerManager12.msc (適用 SQL Server 2014)、SQLServerManager11.msc (適用 SQL Server 2012) 或 SQLServerManager10.msc (適用 SQL Server 2008),然後按 Enter 鍵。

  • SQL Server 2014 版本,輸入:SQLServerManager12.msc
  • SQL Server 2012 版本,輸入:SQLServerManager11.msc


預設的檔案位置是:

C:\Windows\System32\SQLServerManager12.msc

可以將其釘選到開始畫面。









SQL Server 組態管理員

SQL Server 組態管理員是一個工具,用來管理 SQL Server 的相關服務、設定 SQL Server 所用的網路通訊協定,以及管理 SQL Server 用戶端電腦的網路連接組態。

SQL Server 組態管理員是一個 Microsoft Management Console 嵌入式管理單元,您可以從 [開始] 功能表存取它,也可以將它加入任何其他 Microsoft Management Console 顯示畫面中。

Microsoft Management Console (mmc.exe) 會利用 Windows System32 資料夾中的 SQLServerManager10.msc 檔來開啟 SQL Server 組態管理員。

SQL Server 組態管理員和 SQL Server Management Studio 利用 Window Management Instrumentation (WMI) 來檢視和變更部份伺服器設定。

WMI 提供統一的方式來協助您連結管理 SQL Server 工具所要求之登錄作業的 API 呼叫,在 SQL Server 組態管理員嵌入式管理單元元件的所選 SQL 服務上,它提供了增強的控制和操作功能。



參考資料

SQL Server 組態管理員
https://msdn.microsoft.com/zh-tw/library/ms174212(v=sql.120).aspx

2015-12-21

Visio 2016、Project 2016 安裝後,無法啟動、沒反應

環境:
1. 作業系統:Windows 10 build 10.0.10586 中文版本
2. 安裝 Visio 2016 中文版本、Project 2016 後,都遭遇到無法啟動執行的問題。

解決方式:
到「控制台」\「程式集」\「程式和功能」,選擇修復的 Office 產品,然後按一下「變更」。
此次是選擇「線上修復」來解決問題。















失敗的應用程式名稱: VISIO.EXE,版本: 16.0.4266.1003,時間戳記: 0x55ceb2d2
失敗的模組名稱: mfc140u.dll,版本: 14.0.23026.0,時間戳記: 0x558ceb77
例外狀況代碼: 0xc0000005
錯誤位移: 0x000000000021a2b3
失敗的處理程序識別碼: 0x27f8
失敗的應用程式開始時間: 0x01d133b4417c4de4
失敗的應用程式路徑: C:\Program Files\Microsoft Office\root\Office16\VISIO.EXE
失敗的模組路徑: C:\Program Files\Microsoft Office\root\Office16\mfc140u.dll
報告識別碼: 601ad72b-4046-4f12-b48f-c62523eee4ee
失敗的套件完整名稱: 
失敗的套件相關應用程式識別碼: 

----------------------------------

錯誤容器 120325741716,類型 4
事件名稱: APPCRASH
回應: 無法使用
Cab 識別碼: 0

問題簽章:
P1: VISIO.EXE
P2: 16.0.4266.1003
P3: 55ceb2d2
P4: mfc140u.dll
P5: 14.0.23026.0
P6: 558ceb77
P7: c0000005
P8: 000000000021a2b3
P9: 
P10: 

附加檔案:
C:\Users\xxxxxx\AppData\Local\Temp\WER828.tmp.WERInternalMetadata.xml

這些檔案可能在這裡:
C:\ProgramData\Microsoft\Windows\WER\ReportArchive\AppCrash_VISIO.EXE_a07c2a482edf94f508eae75f68f9fc3c7d5921_5857cda8_0e5d0bb2

分析符號: 
重新檢查解決方案: 0
報告識別碼: 601ad72b-4046-4f12-b48f-c62523eee4ee
報告狀態: 0
雜湊化容器: 86d7beccada79e7e2995e0477177d15e

2015-10-01

安裝 Office 365 - 64 位元版本


安裝 64 位元的 Office:

  • 如果您是家庭使用者,登入我的帳戶您的頁面,然後選擇 [安裝>語言及安裝選項>其他安裝選項> Office (64 位元) >安裝。
  • 或者,您也可以從光碟,請移至 x64 資料夾,連按兩下Setup.exe。

















依預設我們會安裝 32 位元版本的 Office。

  • 即使您的電腦執行的是 64 位元版本的 Windows,32 位元版本 Office 仍是建議的選項。32 位元版本可避免與 Office 協力廠商增益集發生可能的相容性問題。
  • 您無法在一部電腦上同時安裝 64 和 32 位元版本的 Office。


安裝 64 位元版本 Office 的限制

64 位元版本的 Office 也許在某些情況下的執行效能較佳,但它有以下幾項限制:


  • 使用 ActiveX 控制項程式庫、ComCtl 控制項的解決方案無法運作。


  • 協力廠商 ActiveX 控制項和增益集無法運作。
  • 包含 Declare 陳述式的 Visual Basic for Applications (VBA),不適用於未更新的 64 位元版本 Office。
  • 已編譯的 Access 資料庫 (例如 .MDE 與 .ACCDE 檔案) 無法運作,除非它們專為 64 位元版本的 Office 所寫。
  • 在 SharePoint 中,清單檢視無法使用。
  • 如果您在 32 位元版本的 Office 中使用了特定的增益集,則可能不適用於 64 位元的 Office,反之亦然。 如果有所顧慮的話,請在安裝新版本之前,先檢查目前版本的 Office。 您不妨考慮測試 64 位元 Office 的增益集,或者看看開發人員能否提供您 64 位元版本的增益集。





參考資料

選擇 32 位元或 64 位元版的 Microsoft Office
https://support.office.microsoft.com/zh-tw/article/%E9%81%B8%E6%93%87-32-%E4%BD%8D%E5%85%83%E6%88%96-64-%E4%BD%8D%E5%85%83%E7%89%88%E7%9A%84-Microsoft-Office-2dee7807-8f95-4d0c-b5fe-6c6f49b8d261?ui=zh-TW&rs=zh-TW&ad=TW

2015-07-08

SQL Server 2016 CTP 2.1 自動偵測與提醒,有新版本的元件可以更新

SQL Server 2016 CTP 2.1 自動偵測與提醒,有新版本的元件可以更新

-- 01_下方工作列,通知已經有可用的更新


-- 02_檢視有無更新


-- 03_檢視下載的資料


2015-06-30

安裝程式,自動為 tempdb 建立多個資料檔案 - SQL Server 2016 CTP 2

SQL Server 2016 CTP 2 安裝程式,會自動為 tempdb 建立多個資料檔案。
使用多個資料檔案可減少 tempdb 儲存體爭用並明顯產生更好的延展性。


  • 如果的邏輯處理器數目小於或等於 8,使用相同數目的資料檔案做為邏輯處理器。
  • 如果邏輯處理器數目大於 8,使用 8 為資料檔案,然後如果爭用持續,請增加資料檔案數目 (最多的邏輯處理器數目) 的 4 的倍數直到爭用降低至可接受的層級,或變更的工作負載/程式碼。



  • 建立最大化磁碟頻寬所需的最多檔案。使用多個檔案可減少 tempdb 儲存體爭用並明顯產生更好的延展性。
  • 不過,不要建立太多檔案,因為這樣會降低效能及增加管理負擔。



  • 一般來說,請為伺服器上的每一個 CPU 建立一個資料檔 (來負責任何相似性遮罩設定),然後依需要向上或向下調整檔案數。
  • 請注意,雙核心 CPU 被視為兩個 CPU。


-- 01_安裝程式,自動為 tempdb 建立多個資料檔案




-- 02_CPU只有一個核心



-- 03_自動偵測_設定僅使用一個 tempdb 資料檔案



-- 04_刻意調整為超過CPU核心數量的資料檔案,錯誤產生






使用SSMS管理工具,檢視tempdb的資料庫檔案

-- 05_SSMS_檢視tempdb的資料庫檔案



使用TSQL,檢視tempdb的資料庫檔案

USE tempdb
GO
SELECT name N'邏輯名稱' , size/128.0 N'使用的磁碟空間(MB)' ,
CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 N'資料實際上使用的空間(MB)',
case is_percent_growth
 when 0 then concat(growth * 8, 'KB')
 else concat(cast(growth as decimal(5, 2)), '%')
end N'檔案成長方式',
size/128.0 - CAST(FILEPROPERTY(name, 'SpaceUsed') AS int)/128.0 N'剩餘的可用空間(MB)', physical_name N'完整檔案路徑與名稱'
FROM sys.database_files;
GO

-- 06_TSQL_檢視tempdb的資料庫檔案





參考資料

若要降低 SQL Server tempdb 資料庫中的配置爭用的建議
https://support.microsoft.com/en-us/kb/2154845/zh-tw

最佳化 tempdb 效能 - SQL Server 2008 R2
https://technet.microsoft.com/zh-tw/library/ms175527(v=sql.105).aspx

Working with tempdb in SQL Server 2005
https://technet.microsoft.com/en-us/library/cc966545.aspx

tempdb Database - SQL Server 2016 Community Technology Preview 2 (CTP2).
https://msdn.microsoft.com/en-us/library/ms190768.aspx

SQL Server 2016 新功能搶先看 - 動態資料遮罩 / 多重 tempdb 資料檔
http://blogs.technet.com/b/technet_taiwan/archive/2015/06/11/sql-server-2016-new-features-dynamic-data-masking-tempdb.aspx

SQL Server 2016 CTP2 : first thoughts about tempdb database
http://www.dbi-services.com/index.php/blog/entry/sql-server-2016-ctp2-first-thoughts-about-tempdb-database

2015-06-26

安裝SQL Server 2016 CTP 2.1 (Community Technology Preview 2.1)

日期:June 25, 2015






產品編號的差異

CTP 2.1 的產品編號(ProductVersion)是:13.0.300.44
CTP 2.0 的產品編號(ProductVersion)是:13.0.200.172

而其,資料庫的內部版本號碼都一樣是:826



在完成安裝的建置作業後,檢查相關的資訊:

檢視相關的版本資訊:

-- 查詢相關的版本資料
SELECT RIGHT(LEFT(@@VERSION,25),4) N'產品版本編號' , 
 SERVERPROPERTY('ProductVersion') N'版本編號',
 SERVERPROPERTY('ProductLevel') N'版本層級',
 SERVERPROPERTY('Edition') N'執行個體產品版本',
 DATABASEPROPERTYEX('master','Version') N'資料庫的內部版本號碼'
--
SELECT @@VERSION N'相關的版本編號、處理器架構、建置日期和作業系統'
GO


-- 01_查詢相關的版本資料




-- 02_伺服器屬性_一般



-- 03_SSMS_版本編號






安裝SQL Server 2016 CTP 2.1 (Community Technology Preview 2.1) 歷程的抓圖

https://picasaweb.google.com/113773811080744260224/SQLServer2016CTP21

安裝SQL Server 2016 CTP 2.1





下載網址

SQL Server 2016 Community Technology Preview 2.1
Last Visited: June 25, 2015
http://www.microsoft.com/en-us/evalcenter/evaluate-sql-server-2016

SQL Server 2016 Release Notes
SQL Server 2016 Community Technology Preview 2.1 (CTP 2.1)
https://msdn.microsoft.com/en-us/library/dn876712(v=sql.130).aspx

安裝SQL Server 2016 CTP2 (Community Technology Preview 2.0)
http://sharedderrick.blogspot.tw/2015/06/sql-server-2016-ctp2-community.html