2012年6月30日 星期六

如何讀取一個超大的文字檔


        最近由於工作上的需要,接到一個特別的SQL Server Performance Tuning 的 Case,但是客戶的Error Log竟然要到66G左右,想說我的主機只有8G的記憶體,開到來我不就下班了,而且可能系統也會撐不住吧,果然透過了幾個常見的軟體,一開沒多久不是系統無回應,就是系統掛掉了,經過不斷的找尋,終於找到UltraEdit只要設定後,就可以達到。

設定的方法,非常簡單,請參考下列的步驟:

程式版本:UltraEdit Professional 10.10c


1、開啟 UltraEdit 之後選擇 Advanced -> Configuration。
2、取消勾選 [Disable line numbers (Helps large file handing)]。
3、選取 [Open file without temp file but NO Prompt (CAUTION: Edits are pemanent, decreases load time large files)]
4、Threshold for above (KB): 500000



參考連結:
http://www.ultraedit.com/support/tutorials_power_tips/ultraedit/large_file_handling.html


關鍵字:Large FileUltraEditLarge File Handing

2012年6月25日 星期一

如何透過T-SQL進行Database Mirroring的節點角色切換

        之前的文章已有介紹到許多關於Database Mirroring的部份,相信大家都有一定的了解,本篇這次再來介紹,在Database Mirroring的架構下,如果要有自動 Failover 的功能時,就必須要有第三台Witness進行監控的動作,但是實際的情況下,可以只能有兩台進行,這時就必須以手動的方式進行 Failover 的動作。

        但是當 Principal 的主機無法提供服務時,該如何透過第二個節點(Mirror)接任Principal的角色,由於當第一個節點無法服務時,此時無法透過GUI的方式進行切換,所以本篇就來介紹該如何進行。

前導文章:
SQL Server - 如何建立 Database Mirroring
http://caryhsu.blogspot.tw/2011/12/sql-server-database-mirroring.html
SQL Server 2012 AlwaysOn vs. Database Mirroring
http://caryhsu.blogspot.tw/2012/04/sql-server-2012-alwayson-vs-database.html


第一台(Principal)無法服務時,如何進行手動的Failover的方式。

當第一台(Principal)無法服務時,無法透過GUI進行切換的動作,所以必須透過下列的方法進行。

1、您的Database Mirroring只有兩台,但是建議您先將作業模式更改為 [不具有自動容錯移轉的高安全性(同步)],藉以減少日後手動進行容錯移轉時,造成資料遺失的可能性。
ALTER DATABASE [Database Name] SET SAFETY FULL
GO



2、當Principal 的主機無法服務時,請執行下列的語法進行 Principal 與 Mirror角色的對換。
ALTER DATABASE [Database Name] SET PARTNER
FORCE_SERVICE_ALLOW_DATA_LOSS


3、當原本的Principal上線時,您可以透過下列的指令讓Database Mirroring繼續進行同步。
ALTER DATABASE [Database Name] SET PARTNER RESUME



參考網址:
ALTER DATABASE Database Mirroring (Transact-SQL)
http://msdn.microsoft.com/en-us/library/bb522476.aspx

關鍵字:SQL ServerDatabase Mirroring

2012年6月22日 星期五

Java程式如何使用JDBC 4.0連線到SQL Server

        SQL Server使用率不斷的提高,前端的應用程式不只是由Microsoft所推出的.Net應用程式外,也可以讓其他不同的應用程式進行存取與使用,在這篇我就來介紹如何透過 Microsoft 所推出的JDBC 4.0來進行與Java的連線。

設定流程:

1、軟體下載:
Microsoft JDBC Driver 4.0 for SQL Server
http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774

2、目錄設定:
  • 下載後即可點選執行檔,即可進行解壓縮。
  • 解壓縮後,在 %ProgramFiles% 建立一個名稱為 Microsoft JDBC Driver 4.0 for SQL Server 的目錄。
  • 再將檔案複製到此目錄下,目錄如下。
    %ProgramFiles%\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_<version>\<language>\help\default.htm. This will display the help system in your Web browser.

3、環境變數設定
CLASSPATH = .;C:\Program Files (x86)\Microsoft JDBC Driver 4.0 for SQL Server\sqljdbc_4.0\enu\sqljdbc.jar

4、範範程式:
import java.*;
import java.sql.*;

public class test_connection{
     private java.sql.Connection  con = null;
     private final String url = "jdbc:sqlserver://";
     private final String serverName= "SQL_SERVER_NAME";
     private final String portNumber = "1433";
     private final String databaseName= "DB_NAME";
     private final String userName = "USER_NAME";
     private final String password = "PASSWORD";
     
     // Constructor
     public test_connection(){}
   
     private String getConnectionUrl(){
 return url+serverName+":"+portNumber+";databaseName="+databaseName+";user="+userName+";password="+password+";";
     }
   
     private java.sql.Connection getConnection(){
          try{
               Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      con = DriverManager.getConnection(getConnectionUrl());
               if(con!=null) System.out.println("Connection Successful!");
          }catch(Exception e){
               e.printStackTrace();
               System.out.println("Error Trace in getConnection() : " + e.getMessage());
         }
          return con;
      }

     /*
          Display the driver properties, database details
     */

     public void displayDbProperties(){
          java.sql.DatabaseMetaData dm = null;
          java.sql.ResultSet rs = null;
          try{
               con= this.getConnection();
               if(con!=null){
                    dm = con.getMetaData();
                    System.out.println("Driver Information");
                    System.out.println("\tDriver Name: "+ dm.getDriverName());
                    System.out.println("\tDriver Version: "+ dm.getDriverVersion ());
                    System.out.println("\nDatabase Information ");
                    System.out.println("\tDatabase Name: "+ dm.getDatabaseProductName());
                    System.out.println("\tDatabase Version: "+ dm.getDatabaseProductVersion());
                    System.out.println("Avalilable Catalogs ");
                    rs = dm.getCatalogs();
                    while(rs.next()){
                         System.out.println("\tcatalog: "+ rs.getString(1));
                    }
                    rs.close();
                    rs = null;
               }else System.out.println("Error: No active Connection");
          }catch(Exception e){
               e.printStackTrace();
          }
 finally {
              closeConnection();
          }
          dm=null;
     }

     public void test_insert(){
          java.sql.Statement stmt = null;
          String str_sql = "";     
 java.text.SimpleDateFormat df = new java.text.SimpleDateFormat();

          try{
               con= this.getConnection();
               stmt = con.createStatement();
      df.applyPattern("yyyy-MM-dd HH:mm:ss");

               if(con!=null){
str_sql = "insert into cary_test_table " +
                                  "values(" + i + ",'test')";
                        stmt.execute(str_sql);
                        java.util.Date now = new java.util.Date();
                        System.out.println("Inserted Sucessful:" + df.format(now));
               }else System.out.println("Error: No active Connection");
          }catch(Exception e){
               e.printStackTrace();
          }
 finally {
     if(stmt != null){
                  try{
                      stmt.close();
                  }
                  catch(SQLException e) {
                      e.printStackTrace();
                  }
              }
              closeConnection();
          }
     }
   
     private void closeConnection(){
          try{
               if(con!=null)
                    con.close();
               con=null;
          }catch(Exception e){
               e.printStackTrace();
          }
     }
     public static void main(String[] args) throws Exception
       {
          test_connection myDbTest = new test_connection();
          myDbTest.displayDbProperties();
          myDbTest.test_insert();
       }
}


參考網址:
Microsoft JDBC Driver 4.0 for SQL Server
http://www.microsoft.com/en-us/download/details.aspx?displaylang=en&id=11774
如何: 著手進行 Microsoft JDBC
http://support.microsoft.com/kb/313100

關鍵字:SQL ServerJavaJDBC

2012年6月19日 星期二

如何使用Reporting Service製作報表

        在前面幾個章節介紹了滿多Reporting Service的使用,相信大家都對Reporting Service有了一定的認識,但是最近接到滿多從不同領域轉而使用Reporting Service時遇到不知如何下手,所以此篇我們來介紹個最基本的,就是如何製作你的第一張報表。

本篇我們透過以前就非常有名的北風資料庫 (Northwind) 為範例,如果你沒有此資料庫時,請先至下列的網址下載並安裝。

Northwind and pubs Sample Databases for SQL Server 2000
http://www.microsoft.com/en-us/download/details.aspx?id=23654

設計流程:
1、開啟 SQL Server Business Intelligence Development Studio
2、點選 [File] -> [New] -> [Project] 3、請選擇 Business Intelligence Projects -> Report Server Project

4、新增一個 [Shared Data Sources],連線到您的資料來源主機

5、輸入資料來源屬性

6、新增一張報表

7、選擇在步驟5中建立的Data Source

8、請輸入您要查詢的語法 SELECT Orders.OrderID, Orders.OrderDate, Customers.CompanyName, Products.ProductName,
OrderDetails.UnitPrice, OrderDetails.Quantity
FROM Orders INNER JOIN OrderDetails ON
Orders.OrderID = OrderDetails.OrderID INNER JOIN
Customers ON Orders.CustomerID = Customers.CustomerID INNER JOIN
Products ON OrderDetails.ProductID = Products.ProductID


9、請選擇 [Tabular]

10、由於我的查詢是秀出訂單資訊,所以我將OrderID、OrderDate、CompanyName這些訂單主表的資訊放在群組中,其他的資訊則放在細項資料。

11、呈現的方式可以選擇 [Stepped] 即可,另外為了統計群組資訊,請額外勾選 [Include subtotals]

12、樣式請自行選擇即可。

13、報表呈現(設計模式)
14、由於我們只需要一個群組即可,所以你可以把 [OrderData]與[CompanyName]移到同一列,完成後如下圖。

15、報表預覽

關鍵字:Reporting ServiceNorthwind

2012年6月12日 星期二

如何處理 SQL Server Compact 的資料庫

        SQL Server的應用非常的廣泛,也有不同的版本提供使用者進行選擇,而在智慧型裝置上由於硬體上的限制,所以可以安裝的軟體就會與一般桌上型電腦的軟體不同,而SQL Server Compact就是專門開發出應用在此領域上的軟體。

SQL Server Compact 3.5 的概觀
-----------------------------------------------------------------------------------------------
SQL Server Compact 3.5 是裝置應用程式的理想資料庫,因為其中提供:
  • 輕量型作業 (是在處理序中執行的,且在裝置上只需要 2MB 安裝空間)。
  • SQL Server 查詢程式設計功能的豐富子集。
  • SQL Server 資料型別豐富而一致的子集。
  • ADO.NET 和 OLE DB 的支援。
  • 使用 .sdf 資料庫檔案的本機資料存放。

會特別介紹到這一篇主要由於最近同事有需要將SQL Server Compact的檔案轉到SQL Server中進行資料的匯整,所以與我討論是否有較合適的方式,本來想說可以透過SSIS(SQL Server Integration Services) 來進行匯入匯出(Import/Output),但可惜的是,SQL Server Compact只能當成目的端,無法變成來源端,也就是只能將資料匯入SQL Server Compact,但是無法匯出,如下圖。


後來我找到了一個好方法,在此分享給大家,我將個人的方法整理如下,再請參考。


1、透過SQL Server Management Studio連線到 SQL Server Compact。
1-1 請先安裝 SQL Server Compact 套件

Microsoft SQL Server Compact 4.0
http://www.microsoft.com/en-us/download/details.aspx?id=17876
Microsoft SQL Server Compact 3.5 Service Pack 2 for Windows Desktop
http://www.microsoft.com/en-us/download/details.aspx?id=5783

1-2 開啟 SQL Server Management Studio,在Server type的地方請選擇 [SQL Server Compact] ,然後Database file請輸入你存放 SDF (SQL Server Compact檔案的附檔名) 的檔案位置。

1-3 連線完成後,你就可以透過 SQL 語法存取此檔案。

由於內建的功能無法將SDF的檔案匯入到SQL Server中,所以我們要再安裝下列的套件,然後你就可以透過SQL Server Management Studio進行。


2、安裝整合套件
2-1 請下載並安裝下列的檔案。

SQL Compact data and schema script utility
http://exportsqlce.codeplex.com/releases/view/80551



2-2 安裝完成後,您再次啟動SQL Server Management Studio,你就可以看到可以透過此工具將檔案與資料轉成SQL的語法進行匯出了。




最後由於資料都是採取全部匯出的方式,所以有必須進行差異比對時,就必須在匯入後再進行處理即可,或許有其他更好的軟體或處理方式,希望大家也不吝分享了,謝謝。


參考連結:
使用 SQL Server Compact 3.5 資料庫 (裝置)
http://msdn.microsoft.com/zh-tw/library/aa983313(v=vs.90).aspx
SQL Compact data and schema script utility
http://exportsqlce.codeplex.com/


關鍵字:SQL ServerSQL Server CompactSDF

2012年6月9日 星期六

Reporting Service整合Bing與Map元件

        上一篇我已介紹如果在Reporting Service中整合Map元件,但是眼尖的人應該有注意到,在Map元件也可以整合Bing的地圖,但是關於相關的整合方法在網路上,可參考的比較少,所以我就在這一篇再深入介紹如何引用Bing在Map元件中。

相關文章:
Reporting Service整合Map元件
http://caryhsu.blogspot.tw/2012/06/reporting-servicemap.html

設計流程說明:
1、 開啟 [SQL Server Business Intelligence Development Studio]
2、 開啟一個新的報表專案
3、 新增一個 [Shared Data Sources] ,資料庫請選擇 [AdventureWorksDW2008R2],如果沒有此範例資料庫的話,請到下列的網址進行下載與安裝。


參考文章:
安裝SQL Server 中的範例資料庫
http://caryhsu.blogspot.tw/2011/02/sql-server.html

4、 新增一個空白報表,然後將 Map 元件加入

5、請選擇 [SQL Server spatial query] ,然後選擇下一步。

6、請選擇 [Add a dataset that includes fields that relate to the spatial data that you chose earlier] 新增一個新的 Dataset

7、點選 [New] 指定原本已新增的 Data Source

8、點選 [New] 之後,再點選 [Use shared data source reference] ,然後選擇一開始建立的 Data Source。

9 、請將下列的查詢語法貼入下列的查詢視窗中。
SELECT HumanResources.Address.AddressID, HumanResources.Address.AddressLine1, HumanResources.Address.AddressLine2, HumanResources.Address.City, HumanResources.Address.StateProvinceID, HumanResources.Address.PostalCode, HumanResources.Address.SpatialLocation FROM Sales.SalesOrderHeader INNER JOIN HumanResources.Address ON Sales.SalesOrderHeader.BillToAddressID = HumanResources.Address.AddressID WHERE (HumanResources.Address.City = N'Lavender Bay')

10、在右半邊的 [Layer type:] 請選擇 Point,然後請勾選下方的 [Add a Bing Maps tile Type],而 Tile Type 的部份請選擇[Hybrid]。

11、呈現節點的方式,我們以第一種為例。

12、最後樣式的部份,您可以自行選擇,然後點選完成即可。

13、背影的部份在開發環境下可能會有看不到的情況,你可以嘗試將報表部署到主機端後再行確認即可。


背景圖片如果無法載入時處理方式。
最後補充,當你在畫面上無法看到上述的背景圖時,你會看到顯示 [Unable to connect to the remote server],再請參考下列的方式進行解決。

解決方法:
1、請開啟下列的檔案。 預設路徑:C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportServer\web.config
2、加入下列的設定值,此區的設定值,你必須放置在 </runtime> 與 </configuration> 的中間即可。

<system.net>
<defaultProxy enabled="true" useDefaultCredentials="true">
<proxy bypassonlocal="True" proxyaddress="PorxyServer:Port" />
</defaultProxy>
</system.net>



上述紅色的區塊請更改為您目前可使用的ProxyServer與Port。





關鍵字:SQL ServerReporting ServiceMapBing

2012年6月2日 星期六

Reporting Service整合Map元件

        Reporting Service隨著版本不斷的更新,功能也不斷的推陳出新,我個人是從SQL Server 2005之後開始接觸,但是在Reporting Service 2008之後,更新與改變後的功能更是接近可以取代其他有名且昂貴的報表軟體,而在2008 R2之後,又新增了 Map 的元件,讓你更可以在報表中整合地圖(Map)元件,底下我們就來介紹如何使用此元件。

設計流程:
1、 開啟[SQL Server Business Intelligence Development Studio]
2、 開啟一個新的報表專案
3、 新增一個 [Shared Data Sources],資料庫請選擇 [AdventureWorksDW2008R2],如果沒有此範例資料庫的話,請參考我之前的另一篇文章進行安裝,謝謝。

參考文章:
安裝SQL Server 中的範例資料庫
http://caryhsu.blogspot.tw/2011/02/sql-server.html


4、 新增一個空白報表,然後將Map元件加入

5、 請選擇 [Map Gallery] 和 [USA] -> [USA by State Exploded],然後選擇下一步。

6、 這個步驟您可以手動調整地圖的顯示大小與解析度,採用預設值即可。

7、 地圖樣示,請選擇第二個進行。

8、 請選擇[Add a dataset that includes fields that relate to the spatial data that you chose earlier] 新增一個新的Dataset

9、 點選 [New] 指定原本已新增的 Data Source

點選 [New] 之後,再點選[Use shared data source reference] ,然後選擇一開始建立的Data Source。

10、 請將下列的查詢語法貼入下列的查詢視窗中。 SELECT g.StateProvinceCode, SUM(f.ExtendedAmount) AS Sales
FROM FactResellerSales AS f INNER JOIN
DimDate AS d ON d.DateKey = f.ShipDateKey INNER JOIN
DimReseller AS s ON s.ResellerKey = f.ResellerKey INNER JOIN
DimGeography AS g ON g.GeographyKey = s.GeographyKey
WHERE (d.CalendarYear = @CALENDAR_YEAR) AND (g.CountryRegionCode = 'US')
GROUP BY g.StateProvinceCode


點選[!] 進行執行時,會請你輸入日期的部份,請輸入2007,此時你會看到原本下方查詢的部份就會秀出查詢結果了。

11、 在第一個部份,STUSPS的部份,對應的欄位請選擇 [StateProvinceCode] 即可。

12、 最後樣式的部份,您可以自行選擇,但統計的值,也就是[Field to visualize] ,請選擇[Sum(Sales)],然後點選完成即可。

13、完成後的報表預覽。





參考網址:
Maps (Report Builder 3.0 and SSRS) http://msdn.microsoft.com/en-us/library/ee240845(v=sql.105)#Process

關鍵字:SQL ServerReporting ServiceMap