在某個資料整合的需求中,我必需把A系統的員工專案工時資料及B系統的員工案件處理工時合併成一張報表來檢示,兩系統的分別用MS SQL 2005及MS SQL 2008, 用DB link串完兩資料庫後,當下SQL Script去Union不同Database中的table時,出現這段錯誤「無法解析 UNION 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_BIN" 之間的定序衝突」,原來兩Database的定序是不同的。那麼因不同定序產生的衝突時,該如何處理呢?
作法
原始SQL Script範例如下:
一執行,就發生「無法解析 UNION 作業中 "Chinese_Taiwan_Stroke_CI_AS" 與 "Chinese_Taiwan_Stroke_BIN" 之間的定序衝突」的錯誤訊息,dblink的資料庫用的定序是"Chinese_Taiwan_Stroke_CI_AS",另一系統用的定序是"Chinese_Taiwan_Stroke_BIN",看起是部份欄位定序有衝突,這時,其實只要善用"COLLATE"來轉換成同一定序即可。SELECT [ReportName] ResourceName ,[IssueNo]+'-'+[IssueModule] ProjectName ,[TaskName] TaskName ,sum([WHours]) ActualWorkByDay ,ResourceGroup =[Group] ,TimeByDay = [CreateDate] FROM [ISSUE].[dbo].[EMPReply] Group by [ReportName], [IssueNo], [IssueModule], [TaskName], [Group], [CreateDate] union SELECT [ResourceName] ,[ProjectName] ,[TaskName] ,sum([ActualWorkByDay]) [ActualWorkByDay] ,[ResourceGroup] ,[TimeByDay] FROM [192.168.1.100].[ProjectServer].[dbo].[ResTaskHourByDay] Group by [ResourceName], [ProjectName], [TaskName], [ResourceGroup], [TimeByDay] GO
因此,我們用"COLLATE"指定把dblink的資料庫Select出來的資料,轉換定序成"Chinese_Taiwan_Stroke_BIN",修改後語法如下:
修改後,一run,結果就漂亮的出現了。SELECT [ReportName] ResourceName ,[IssueNo]+'-'+[IssueModule] ProjectName ,[TaskName] TaskName ,sum([WHours]) ActualWorkByDay ,ResourceGroup =[Group] ,TimeByDay = [CreateDate] FROM [ISSUE].[dbo].[EMPReply] Group by [ReportName], [IssueNo], [IssueModule], [TaskName], [Group], [CreateDate] union SELECT [ResourceName] COLLATE Chinese_Taiwan_Stroke_BIN ,[ProjectName] COLLATE Chinese_Taiwan_Stroke_BIN ,[TaskName] COLLATE Chinese_Taiwan_Stroke_BIN ,sum([ActualWorkByDay]) [ActualWorkByDay] ,[ResourceGroup] COLLATE Chinese_Taiwan_Stroke_BIN ,[TimeByDay] FROM [192.168.1.100].[ProjectServer].[dbo].[ResTaskHourByDay] Group by [ResourceName], [ProjectName], [TaskName], [ResourceGroup], [TimeByDay]
總結
用"COLLATE"轉換定序,不只是可用在欄位,Select出來的結果、Create Table、View等等時,都可以用的到,詳可參見Reference。
Reference
設定和變更伺服器定序
設定和變更資料庫定序
設定與變更資料行定序
識別碼定序
沒有留言:
張貼留言