2013年7月30日 星期二

Oracle轉換至SQL Server時,Outer Join運算子的處理方式

最近接到從Oracle轉移到SQL Server的案件,其中由於Oracle在使用查詢中使用了特定的Outer-Join Operators(*=、=*)語法(Non-ANSI),所以在轉換到SQL Server上就遇到問題了,其實在SQL Server 2000的版本上是有支援這個語法的,但是在後續的版本上就會遇到下列的問題。

執行語法:
SELECT e1.[EmployeeID]
      ,e1.[EmployeeName]
      ,e1.[Title]
      ,e1.[ManagerID]
      ,e2.[EmployeeName] mag_name
  FROM [Northwind].[dbo].[Employees] e1, [Northwind].[dbo].[Employees] e2
  where e1.[ManagerID] *= e2.[EmployeeID]

錯誤訊息:
Msg 4147, Level 15, State 1, Line 7
The query uses non-ANSI outer join operators ("*=" or "=*"). To run this query without modification,
please set the compatibility level for current database to 80, using the SET COMPATIBILITY_LEVEL option of ALTER DATABASE. It is strongly recommended to rewrite the query using ANSI outer join operators (LEFT OUTER JOIN, RIGHT OUTER JOIN). In the future versions of SQL Server, non-ANSI join operators will not be supported even in backward-compatibility modes.


解決方法其實很簡單,就是將資料庫的相容性層級(Compatibility Level)設定成80,如此就可以直接使用,但由於在SQL Server 2012已不支援將相容性層級設定成80,所以強烈建議儘量改寫這部份的語法(如下列),以免日後升級時會遇到同樣的問題。

建議語法: SELECT e1.[EmployeeID]
      ,e1.[EmployeeName]
      ,e1.[Title]
      ,e1.[ManagerID]
      ,e2.[EmployeeName] mag_name
  FROM [Northwind].[dbo].[Employees] e1 Left Outer Join [Northwind].[dbo].[Employees] e2
  On e1.[ManagerID] = e2.[EmployeeID]

在SQL Server 2012上,如果要嘗試將相容性層級變更成80時,會遇到下列的錯誤訊息,因為已不支援這個相容性層級了。

錯誤訊息:
Msg 15048, Level 16, State 1, Line 1
Valid values of the database compatibility level are 90, 100, or 110.

關鍵字:SQL ServerCompatibility LevelOuter Join Operators

2013年7月25日 星期四

為愛而學!! 由Study4.TW主辦,SQL Pass和twMVC協辦的年度技術盛會!!

活動介紹
Study4.TW與SQL Pass和twMVC攜手來新竹為大家介紹在今年微軟所發表的最新技術,相信大家對於這些產品都想躍躍欲試,本次活動將由胡百敬老師、Sky、ChiaChi、James與Bibby等五位熱情分享技術的 MVP 來為大家介紹最新的技術,讓您在業界或學校成為最閃耀超級新星!
詳細活動資訊
詳細活動內容請見活動官網,網址為 http://study4love.tw/
活動時間:2013/08/17(六) 09:00 - 17:20
講師:胡百敬老師(SQL PASS)、Bibby(twMVC)、ChiaChi(Study4.TW)、James(Study4.TW)、Sky(Study4.TW)
地點:新竹市科學園區工業東二路1號(科技生活館-達爾文廳)
人數上限: 70人
適合對象:學生、開發人員以及系統開發維護相關人員
課程大綱:
主題/課程簡介 課程時間 講師經歷
使用 Hyper-V 的小細節
Windows Server 2008 開始就有提供 Hyper-V,
而隨著 Windows Server 2008 R2 / 2012 / 2012 R2,Hyper-V 在這些版本中都有許多不錯的功能一直加入,但在這些不同版本使用中,
是否有些我們需要注意的細節被忽略了,希望在這次分享中,可以跟大家聊聊我們在這些版本上使用的一些心得。
09:30 - 10:30
MVP James
  • 微軟最有價值專家
  • 鼎新電腦服務整合中心技術總監
  • Study4.TW 核心成員
  • Hyper-V 虛擬化戰士 - 金翅級
  • Study4.TW 常任講師
使用Visual Studio 2013 來進行敏捷開發
Visual Studio歷經了多代的改變,不再是打打Code、編譯的工具了,想要知道Visual Studio 2013增強了那些功能嗎?
想要了解如何透過Visual Studio 2013來進行整個敏捷軟體開發的流程嗎?
無論是團隊、一個人、或是還在使用Visual Studio 2012的朋友們,讓我們來看看Visual Studio如何應用在軟體開發上!!
10:50 - 11:50
MVP Sky
  • 微軟最有價值專家
  • 集英信誠.NET開發顧問
  • Study4.TW 核心成員、常任講師
  • 微軟Windows Azure BootCamp 台灣區講師
  • 微軟實戰課程日講師
AngularJS with ASP.NET MVC
還在用 jQuery 寫前端嗎?還在辛苦的操作 DOM 元素嗎?
還在因為越來越複雜 JavaScript 難以維護而煩惱嗎?
那您一定要瞧瞧 AngularJS 這個前端的 Javascript Framework,它由 Google 負責維護,雙向 Data Binding,MVC 的架構,簡單直覺易使用的特性,讓您有系統的撰寫JavaScript,本課程帶您認識 AngularJS 的核心觀念、關鍵技巧以及專案上可能遇到的一些問題。
13:30 - 14:30
MVP Bibby
  • 微軟最有價值專家
  • Windows Phone 獨立開發者
  • twMVC 聯合創辦人
  • 公司職訓課程講師
  • twMVC 常任講師
Open Data Protocol for Enterprise Solution
  • OData Protocol Introduction
  • Why to Use OData for Enterprise
    Microsoft Solution for OData
  • OData Operate Data
  • How to Use OData in Enterprise
  • Conclusion
14:45 - 15:45
MVP 郭家齊
  • 微軟最有價值專家
  • 友達光電 營運資訊處 工程副理
  • Study4.TW 核心成員
  • 雲林科技大學工業工程與管理專題講座主講人
  • 漢翔工業全球運籌管理專題講座主講人
SQL Server 2014 新功能探討 
  • SQL Server 2014 記憶體內資料庫 - 簡介
  • SQL Server 2014 記憶體內資料庫 - 資料結構
  • SQL Server 2014 記憶體內資料庫 - 資料更新
  • SQL Server 2014 記憶體內資料庫 - 語法相容性
16:00 - 17:00
MVP 胡百敬
  • 微軟最有價值專家
  • 集英信誠合夥顧問
  • 恆逸資訊約聘講師
  • 台灣微軟約聘顧問
  • SQL PASS Taiwan 核心成員
  • TechDays、MSDN、TechNet常任講師
報名資訊
報名時間:2013/07/26 12:00 - 08/15 23:59
票種:Study4.TW為愛而學 場地費
票價:NTD $250
報名網址:http://registrano.com/events/eeb127

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