2013年7月4日 星期四

安裝SQL Server 時,遇到NetFx3錯誤處理方式。

SQL Server 2014 CTP1已經開始開放下載了,但在嘗試安裝後,很不幸的遇到的安裝錯誤,但好在很快的就找出這個問題,並已解決,我將過程整理如下,再請參考。。 


SQL Server 2014 CTP1 下載網址:
Download Microsoft SQL Server 2014 Community Technology Preview 1 (CTP1) http://technet.microsoft.com/en-us/evalcenter/dn205290.aspx

安裝環境:
Windows 2012
SQL Server 2014 CTP1

錯誤訊息:
Error while enabling Windows feature:NetFx3, Error Code:-2146498298, Please try enabling Windows feature:NetFx3 from Windows management tools and then run setup again. For more information on who to enable Windows features, see http://go.microsoft.com/fwlink/?linkid=227143



其實解決的方方在錯誤訊息的部份已有寫的很清楚,就是需要新增.Net Framework 3.5即可,你只需要在Add Roles and Features中勾選 [.NET Framwork 3.5 Features],然後再次進行SQL Server的安裝即可。



關鍵字:SQL Server 2014 CTP1、NetFx3、-2146498298

2013年7月2日 星期二

如何透過SQL Server的Full-Text快速搜尋文件內容

        SQL Server的功能不斷的增強,也整合了檔案與資料庫的部份(FileTable)等,在SharePoint的部份由於可以進行文件的控管,所以也會有許多的檔案上傳至SharePoint中,進行集中化的管理。所以本篇我們就來介紹如何透過Full-Text與Office中的 iFilter 套件,進行文件關鍵字的搜尋。

本篇我們將以繁體中文與同義字的部份進行測試,並且嘗試搜尋DOCX與XPS的檔案格式。

環境建置:
1、請先確認主機上是啟用SQL Server的主機上XPS Viewer的功能啟用。(Windows 2008)

1-1 請先至 Features中加入 [XPS Viewer] 的功能。

參考網址:
XPS IFilter for SQL 2008 (64bit) on server 2008 (64bit)
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/595bbadf-f480-4953-a9d9-f9a4733e5181/xps-ifilter-for-sql-2008-64bit-on-server-2008-64bit
Enabling XPS in Windows Server 2008
http://blogs.msdn.com/b/adrianford/archive/2008/02/12/enabling-xps-in-windows-server-2008.aspx


2、請執行下列的語法進行XPS檔案格式的啟用
exec sp_fulltext_service 'load_os_resources',1;
exec sp_fulltext_service 'verify_signature',0;

3、執行完成後,請重新啟動SQL Server Service,並請執行下列的語法進行確認。
select document_type, path from sys.fulltext_document_types


4、請安裝下列的Office Filter Packs套件

Microsoft Office 2010 Filter Packs
http://www.microsoft.com/en-us/download/details.aspx?id=17062

5、您可以透過下列的語法確認目前Full-Text支援的語系
select * from sys.fulltext_languages



測試資料建立
1、 建立測試資料表
CREATE TABLE [dbo].[testTBL](
 [doctype] [nvarchar](50) NOT NULL,
 [document] [varbinary](max) NULL,
 [docname] [varchar](50) NOT NULL,
 CONSTRAINT [PK_testTBL] PRIMARY KEY CLUSTERED
 ( [docname] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 ) ON [PRIMARY]

備註:
Filters (iFilters). Indexing a document in a varbinary(max), image, or xml data type column requires a filter to perform extra processing. The filter must be specific to the document type (.doc, .pdf, .xls, .xml, and so forth). For more information, see Configure and Manage Filters for Search.

2、建立Full-Text Index
CREATE FULLTEXT CATALOG [CatalogTEST]
WITH ACCENT_SENSITIVITY = OFF
AUTHORIZATION [dbo]
GO

CREATE FULLTEXT INDEX ON [dbo].[testTBL](
[docname] LANGUAGE [Traditional Chinese],
[doctype] LANGUAGE [Traditional Chinese],
[document] TYPE COLUMN [doctype] LANGUAGE [Traditional Chinese])
KEY INDEX [PK_testTBL]ON ([CatalogTEST], FILEGROUP [PRIMARY])
WITH (CHANGE_TRACKING = AUTO, STOPLIST = SYSTEM)
GO

3、新增二筆資料,此時我會將docx與xps的資料新增到資料庫中。
INSERT INTO dbo.testTBL(doctype,docname,document)
 SELECT '.docx' AS doctype, 'LogMeIn.docx' AS docname, *
 FROM OPENROWSET  (BULK N'F:\LogMeIn.docx',
 SINGLE_BLOB) AS Document

INSERT INTO dbo.testTBL(doctype,docname,document)
 SELECT '.xps' AS doctype, 'LogMeIn.xps' AS docname, * FROM OPENROWSET
 (BULK N'F:\LogMeIn.xps', SINGLE_BLOB) AS Document

4、您可以透過下列的語法確認目前在此Index上所建立的Term有那些。
SELECT * FROM sys.dm_fts_index_keywords(db_id('test_db'), object_id('dbo.testTBL'))


5、增加繁體中文同義字的定義。

你可以到下列的路徑找到檔案。 C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\FTData\ tscht.xml
請先將開頭的註解移除後,再請新增下列的資訊。
<replacement>
<pat>MS</pat>
<sub>Microsoft</sub>
</replacement>  
<replacement>
<pat>連結</pat>
<sub>連線</sub>
</replacement>  

透過第四節的資訊中,我們知道系統已有建立二個Term,分別是Microsoft連線,所以我們希望可以透過同義字的定義,MS -> Microsoft 與 連結 -> 連線,分別可以來找到所需的資訊。

6、新增完成後,由於同義字檔案中有中文字,所以如果單純的透過指令載入時,可能會因為定序的關係造成錯誤,所以必須透過下列的方式載入同義字的檔案。
USE master
GO
CREATE DATABASE temp_sbcs COLLATE SQL_Latin1_General_CP1_CI_AS
GO

USE temp_sbcs
GO

EXEC sys.sp_fulltext_load_thesaurus_file 1028
GO

USE master
GO
DROP DATABASE temp_sbcs
GO

PS:載入時由於檔案中有包含中文字,所以需請透過下列的方式進行解決。

錯誤訊息:
Msg 50000, Level 16, State 1, Procedure sp_fulltext_rethrow_error, Line 36
Error 30049, Level 16, State 1, Procedure sp_fulltext_thesaurus_update, Line 61, Message: Fulltext thesaurus internal error (HRESULT = '0x8007054e')

參考網址:
You cannot load a thesaurus file in SQL Server, and you receive the following error message: "ERROR_INTERNAL_DB_CORRUPTION"
http://support.microsoft.com/kb/2014749/en-us

7、載入完成後,我們先進行下列的查詢確認原始資料的情況。
select * from dbo.testTBL where contains(document, N'連線')


select * from dbo.testTBL
where contains(document, N'連結')


select * from dbo.testTBL
where contains(document, N'Microsoft')


select * from dbo.testTBL
where contains(document, N'MS')



8、接下來我們透過同義字的方式來進行搜尋,確認在同義字的定義上皆可正常的運作。
select * from dbo.testTBL
where contains(document, N'FORMSOF(THESAURUS,"ms")')


select * from dbo.testTBL
where contains(document, N'FORMSOF(THESAURUS,"連結")')



透過上列的方式,可以簡單的整合Full-Text與iFilter的套件,讓文件的管理可以更簡單的達到,本篇中主要使用到DOCX與XPS的檔案格式,但是其他的檔案格式其實方法都相同,大家可以多多的利用這個方式。

關於支援的檔案格式,請參考下列的網址:

Supported File Formats for #SQLServer Full Text Search (IFilter) http://www.olschimke.eu/2012/07/31/supported-file-formats-for-sqlserver-full-text-search-ifilter/


參考連結:
XPS IFilter for SQL 2008 (64bit) on server 2008 (64bit) http://social.msdn.microsoft.com/Forums/sqlserver/en-US/595bbadf-f480-4953-a9d9-f9a4733e5181/xps-ifilter-for-sql-2008-64bit-on-server-2008-64bit
Enabling XPS in Windows Server 2008
http://blogs.msdn.com/b/adrianford/archive/2008/02/12/enabling-xps-in-windows-server-2008.aspx
How to register Microsoft Filter Pack IFilters with SQL Server
http://support.microsoft.com/default.aspx?scid=kb;en-us;945934
Full-Text Search (SQL Server)
http://technet.microsoft.com/en-us/library/ms142571.aspx
Configure and Manage Thesaurus Files for Full-Text Search
http://technet.microsoft.com/en-us/library/ms142491.aspx
You cannot load a thesaurus file in SQL Server, and you receive the following error message: "ERROR_INTERNAL_DB_CORRUPTION"
http://support.microsoft.com/kb/2014749/en-us


關鍵字:Full-Text SearchiFilterSynonymThesaurus Files

2013年6月27日 星期四

如何更換SQL Server Cluster上的 IP 與 Virtual Server Name

        對於許多使用來說,應該較少有機會進行到Cluster上Virtual Server Name與Virtual Server IP的更換,但如果當有要進行主機的重新規畫,或主機搬移時,就有可能進行到,所以本篇我們來介紹如何進行這部份,其實方式非常的簡單,但是在更換前有一些程序需要先行確認,藉以將更換時的影響時間降到最低。

注意事項:
1、先行更新DNS上的名稱。
      移除舊的名稱與增加新的名稱。
2、手動先行註冊SPN (Service Principal Name)
3、確認連線到Server上的AP等程式已有先行找出對應的名稱並進行更換。
4、確認host的檔案是否有相同的名稱,有的話請一同修改。

更換作業:
1、開啟叢集管理員
2、點選您的SQL Server 服務。
3、請先點伺服器名稱,然後選擇 [讓此資源離線]。


4、等到都離線成功後,再點選伺服器名稱 -> 內容。
5、點選內容後,DNS 名稱就是您的Virtual Server Name,也就是您Cluster對外的名稱,而IP的部份,您可以編輯,藉以進行更換即可。


當您點選確定後,如果發生錯誤,有可能是你的名稱或IP在使用中,或是你的服務沒有進行離線,所以必須逐一確認後進行排除即可。


參考網址:
Changing the IP address of network adapters in cluster server
http://support.microsoft.com/kb/230356 How to change the network IP addresses of SQL Server failover cluster instances
http://support.microsoft.com/default.aspx?scid=kb;EN-US;244980
How to: Rename a SQL Server 2005 Virtual Server
http://msdn.microsoft.com/en-us/library/ms178083.aspx
How to: Rename a Computer that Hosts a Stand-Alone Instance of SQL Server 2005
http://msdn.microsoft.com/en-us/library/ms143799.aspx
Renaming a Report Server Computer
http://msdn.microsoft.com/en-us/library/ms345235.aspx


關鍵字:SQL ServerClusterRenameService Principal Name

2013年5月25日 星期六

如何秕次轉移Windows 2008R2上的Hyper-V至Windows 2012

        最近由於個人的設備升級,所以想說也同時將我的OS也一同升級,從 2008R2升級到2012,但由於我的電腦中有使用到許多的VM,所以在轉移前一直在找是否有比較好的方式進行轉移,在與我的同事Aska Su與Felix Hu討論後,所以我決定透過語法的方式批次轉移,主要是由於因為透過介紹一次選擇多個VM視窗匯出時,系統會以平行處理的方式進行,此時坦白說不會比較快(可能會更慢),所以大部份都是建議逐一選擇後再匯出,但我不太喜歡這種方式,後來終於透過PowerShell,終於可以批次匯出,底下我就來介紹這個方法。

轉移程序:
1、請手動將目前的所有VM進行關機的動作,請記錄如果VM的狀態為 [已儲存] 的狀態時,也請將VM啟動後進行關閉的動作,以免轉移後 [可能] 發生問題。

2、請至下列的網址進行 PowerShell for Hyper-V的Library的安裝。

PowerShell Management Library for Hyper-V
http://pshyperv.codeplex.com/

下載後解壓縮並執行 install.cmd之後即可進行安裝,如下圖。



3、安裝完成後即會出現下列的PowerShell畫面,此時請輸入下列的語法,即可逐一的將VM進行匯出。

get-vm | Export-VM  -path G:\vm -copystate -wait -force

上述中紅色的區塊指的是你的匯出位址。


4、在匯入前請先確認在新舊兩台機器上的 [虛擬交換器管理員] 是否相同,如果你在舊機器上有新增交換器時,也請新增相同的名稱於新機器上。

5、最後請手動匯入虛擬機器,如果您在執行手動匯入時,發現在跳出提醒,代表你的VM在匯出時,狀態已儲存,所以才會有這種情況,這時候你可以嘗試忽略錯誤繼續進行,但有時候會匯入失敗,需特別的注意,如此即可完成轉換的步驟。

參考網址:
PowerShell Management Library for Hyper-V
http://pshyperv.codeplex.com/
How to batch export virtual machines in Windows Server 2012 (PowerShell)
http://gallery.technet.microsoft.com/scriptcenter/How-to-batch-export-84c13ee2


關鍵字:Hyper-VGet-VMExport-VM、Windows 2012

2013年5月7日 星期二

報表設計 - 查無資料時顯示特定文字與表頭資訊

        相信很多有設計報表的人都會遇到一件事,就是當此次的查詢條件查無資料時,在預設的情況下,並不會顯示任何的資訊,只會顯示標題而已,常有客戶困惑的問到,這樣到底是否有正常的執行,所以往往希望我們可以在沒有任何資料顯示的情況下,至少顯示 "查無資料" 等訊息。

        其實在2008之後,在Tablix上已有內建一個屬性,那就是NoRowsMessage(感謝Ray Yen大師的提點),只需在此屬性上設定後,即可顯示一段特定的文字,但問題來了,這樣的文字有點太過於簡單,而且重點是原本的表頭也不見了,所以客戶希望我們可以也同時秀出表頭的資訊。

        在以往的情況下,其實我們可以透過SQL語法的部份進行判斷,然後增加這個方式,但這個方法有點麻煩,而且每張報表都要這個功能時,都要再額外寫SQL進行處理,真是費時費工,還好貼心的Reporting Service也有一個方式可以作到,本篇我們就來介紹如何進行。

設定方式:
1、首先我們還是利用北風資料庫作了一張階層式的報表,然後透過屬性值來過濾資料。

2、接著請在此Tablix 1上的 NoRowsMessage 屬性中加入您想要顯示的值,比如說 "查無資料" 等,此時請再次進行查詢,然後您就可以看到顯示的情況。

3、請將原本的Tablix 1再複制一個複本出來,名稱暫訂為Tablix 2,然後放置在原本的Tablix 1的下方,如下圖。

4、請將原本的Tablix 1中的NoRowsMessage值清除,只保留下方Tablix 2中的值。
5、點選Tablix 2的Properties -> Visibility -> Show or hide based on an Expression

6、在運算式中輸入下方的語法,其中Fields!OrderID.Value就是你查詢的欄位名稱,輸入完成後再點選ok即可。

7、再次預覽,此時你就可以同時呈現表頭與特定文字。


參考連結:
Set a No Data Message for a Data Region (Report Builder and SSRS)
http://msdn.microsoft.com/zh-tw/library/dd220407.aspx


關鍵字:Reporting ServiceNoRowsMessageNo Data Available