Selasa, 16 Juni 2009

Select data dari Excel di SQL Server 2005

Ketika kita sudah terbiasa dengan syntax query SQL, pengolahan data rasanya lebih mudah jika dilakukan dengan SQL query. Modifikasi dapat dilakukan dengan SQL query sehingga data yang tampil sesuai dengan yang kita inginkan.

Pernah suatu ketika saya memperoleh data yang banyak dalam dua file Excel. Saya harus membandingkan data-datanya. Ya....,  saya mencari cara untuk memindahkan data Excel tersebut kedalam SQL. Berikut caranya :



SELECT *
FROM   OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', 'Data Source=C:\test\xltest.xls;Extended Properties=Excel 8.0')...[Customers$]



SELECT *
FROM   OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                  'Excel 8.0;Database=C:\test\xltest.xls',
                  [Customers$])



SELECT *
FROM   OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                  'Excel 8.0;Database=C:\test\xltest.xls',
                  'SELECT * FROM   [Customers$]') 

Ketiga syntax diatas dapat di run. Customers$ itu adalah nama sheet dalam file Excelnya. Nama sheet tersebut diakhiri dengan tanda $. Data pada row pertama di Excel diambil sebagai Nama Kolom pada Sql Server.  Namun biasanya muncul error seperti berikut ketika menjalankan syntax diatas:

Msg 15281, Level 16, State 1, Line 1
SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.

Untuk mengatasinya kita dapat mengaktifkan As Hoc Distributed Queries dengan sp_configure :



SELECT *
FROM   sys.configurations
ORDER  BY name;
GO

Sp_configure 'show advanced options', 1;
GO
 
RECONFIGURE;
GO

Sp_configure 'Ad Hoc Distributed Queries', 1;
GO

RECONFIGURE;
GO 




Untuk memasukan data Excel tersebut kedalam table sementara di SQL server kita dapat menggunakan :


SELECT *
INTO   #temp
FROM   OPENROWSET('Microsoft.Jet.OLEDB.4.0',
                  'Excel 8.0;Database=C:\Test\data.xls',
                  'SELECT * FROM   [Sheet1$]') 

Semoga cara ini bisa membantu kawan-kawan untuk mengambil data dari excel.

7 komentar:

  1. kalo pake sql 2008 sama ga caranya?
    saya malah menemukan error begini
    Msg 7399, Level 16, State 1, Line 1
    The OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)" reported an error. The provider did not give any information about the error.
    Msg 7303, Level 16, State 1, Line 1
    Cannot initialize the data source object of OLE DB provider "Microsoft.Jet.OLEDB.4.0" for linked server "(null)".

    thanks.

    BalasHapus
  2. Saya belum mencoba di sql 2008. Tapi kemungkinan caranya sama.
    Jika kamu mendapatkan error kamu bisa melihat blog ini : http://blogs.msdn.com/spike/archive/2008/07/23/ole-db-provider-microsoft-jet-oledb-4-0-for-linked-server-null-returned-message-unspecified-error.aspx

    BalasHapus
  3. sql yang select data dari excel , mengenal baris pertama excel sebagai judul column, makanya baris pertama dari excel harus berupa judul column nya biar tidak error.

    BalasHapus
  4. kl di server tdk terinstall ms. office akan muncul spt ini :"Msg 7302, Level 16, State 1, Line 1
    Cannot create an instance of OLE DB provider "Microsoft.ACE.OLEDB.12.0" for linked server "Link_AGE"
    gmn caranya create OLEDB tanpa hrs install ms.officenya

    thank's
    paul

    BalasHapus
  5. Wah kalau ga ada installernya kanya bisa
    coba install Access Database Engine.

    tapi blom pernah coba juga saya.

    BalasHapus
  6. gw lg ada problem pengen select dr different columns,
    lets say query udh sama diatas kecuali gw pgn spt ini :

    [Sheet1$A:A,C:C,Z:Z]

    tp ga disupport, pdhl kl record macro excel, kl select "A:A,C:C,Z:Z" itu diperbolehkan kl versi VB Excel.Application.

    sbnrnya gw hny pgn select A,C,Z dari multicolumn excel misalkan ada A:AZ column, gw ga pgn ditaro ke temp table krn ribet nnt mesti create view segala buat ngekeep header column nya?

    gw mau wrap ini jadi storproc.

    any help would be appreciate..

    TX,
    Regards.
    Ch.

    BalasHapus
  7. Copy aja dulu column A, C, Z nya ke new file excel, setelah itu baru diselect dari situ.

    BalasHapus