+ Reply to Thread
Page 2 of 2 FirstFirst 1 2
Results 11 to 12 of 12

Best way to Import data from EXCEL using a TSQL

  1. Re: Best way to Import data from EXCEL using a TSQL

    Thanks Steve

    That is great.

    Know i understand what is going on.

    Thanks heaps for your help.

    Ian



    "Steve Kass" wrote in message
    news:eEsOoBveEHA.1652@TK2MSFTNGP09.phx.gbl...
    > Ian,
    >
    > If you need to represent the value 20.03 exactly, then [float] is the
    > wrong data type to use. The numbers [float] can represent exactly are a
    > specific set of binary fractions, not decimal fractions. Because 20.03
    > cannot be written exactly in the form /, [float]
    > cannot store it exactly. SQL Server provides types to represent decimal
    > fractions exactly: use DECIMAL(p,s) for precision p up to 38 and scale s
    > between 0 and p. If you import the number 20.030000000000001 into a
    > column of type, say, decimal(20, 8), it will be stored as 20.03 exactly.
    >
    > SK
    >
    > Ian wrote:
    >
    > >Hi Steve
    > >
    > >That is fantastic thank you for explaning that.
    > >
    > >This is what i have done.
    > >
    > >Insert Into tbl_Import
    > >select MyID,TextField,DateField,IntField,FloatField,TextFloatField,
    > >TextFloatFieldTwo
    > >from OPENROWSET (
    > > 'Microsoft.Jet.OLEDB.4.0',
    > > 'Excel 5.0;Database=\\Server\RPT\TestImport.xls;HDR=YES;IMEX=1'
    > > ,Import_Data
    > >)
    > >
    > >Select * from tbl_Import
    > >
    > >Delete from tbl_Import
    > >
    > >
    > >It does work. I have attached a small TXT file with the input and output
    > >values whe using Decimales.
    > >
    > >In Excel the Value is 20.03 after import the float is 20.030000000000001
    > >
    > >As the out put showes i may have to format the excel worsheet to Text and
    > >the import the data because i need it to be exact. i cannot have it

    adding
    > >fractions to my input.
    > >
    > >
    > >
    > >Again. Thank you for you
    > >
    > >Ian
    > >
    > >
    > >
    > >
    > >
    > >
    > >
    > >"Steve Kass" wrote in message
    > >news:O%23q8QKleEHA.720@TK2MSFTNGP11.phx.gbl...
    > >
    > >
    > >>That's because you typed HDR=NO where I suggested HDR=YES. HDR means
    > >>"header row", and you have a header row. You can also look at select *
    > >>to see what the columns are, if there's still a problem, and for the
    > >>record, the columns are automatically named F1, F2, F3, ... when you say
    > >>HDR=NO.
    > >>
    > >>SK
    > >>
    > >>Ian wrote:
    > >>
    > >>
    > >>
    > >>>Hi Steve
    > >>>
    > >>>when i execut
    > >>>
    > >>>select MyID,TextField,DateField,IntField,FloatField
    > >>>
    > >>>
    > >>>from OPENROWSET (
    > >>
    > >>
    > >>> 'Microsoft.Jet.OLEDB.4.0',
    > >>> 'Excel 8.0;Database=\\Server1\RPT\TestImport.xls;HDR=NO'
    > >>> ,Import_Data
    > >>>)
    > >>>
    > >>>I get this as an out put.
    > >>>
    > >>>
    > >>>Server: Msg 207, Level 16, State 3, Line 34
    > >>>Invalid column name 'MyID'.
    > >>>Server: Msg 207, Level 16, State 1, Line 34
    > >>>Invalid column name 'TextField'.
    > >>>Server: Msg 207, Level 16, State 1, Line 34
    > >>>Invalid column name 'DateField'.
    > >>>Server: Msg 207, Level 16, State 1, Line 34
    > >>>Invalid column name 'IntField'.
    > >>>Server: Msg 207, Level 16, State 1, Line 34
    > >>>Invalid column name 'FloatField'.
    > >>>
    > >>>
    > >>>
    > >>>BUT
    > >>>
    > >>>
    > >>>When i do
    > >>>
    > >>>select MyID,TextField,DateField,IntField,FloatField
    > >>>
    > >>>
    > >>>from OPENROWSET (
    > >>
    > >>
    > >>> 'Microsoft.Jet.OLEDB.4.0',
    > >>> 'Excel 5.0;Database=\\Server1\RPT\TestImport.xls;HDR=YES;IMEX=1'
    > >>> ,Import_Data
    > >>>)
    > >>>
    > >>>
    > >>>Then it sort of works.
    > >>>
    > >>>It does select the data but some of it is not exact.
    > >>>
    > >>>Excel
    > >>>30.030445111
    > >>>
    > >>>Selected it is
    > >>>30.030445110999999
    > >>>
    > >>>And all the Integers
    > >>>1
    > >>>
    > >>>becomes.
    > >>>1.0
    > >>>
    > >>>
    > >>>Is there some thing else i need to set.
    > >>>
    > >>>
    > >>>Ian
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>"Steve Kass" wrote in message
    > >>>news:uWvJ1xkeEHA.720@TK2MSFTNGP11.phx.gbl...
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>Ian,
    > >>>>
    > >>>> It's much easier if this is in the form of a table. This should
    > >>>>select the information:
    > >>>>
    > >>>>select MyID, TextField, DateField, IntField, FloatField
    > >>>>
    > >>>>
    > >>>>from OpenRowSet(
    > >>>
    > >>>
    > >>>> 'Microsoft.Jet.OLEDB.4.0',
    > >>>> 'Excel 8.0;Database=E:\excel\Blocks.xls;HDR=YES'
    > >>>> ,Sheet1$
    > >>>>)
    > >>>>
    > >>>>if you use the appropriate file name. There should be no reason to
    > >>>>modify the registry in this case, but sometimes you will get

    additional
    > >>>>blank rows imported below the data and you can make the change if need
    > >>>>be. The reason for the changes, if needed, are because the Excel data
    > >>>>provider has various options that are controlled by the registry
    > >>>>
    > >>>>

    > >entries.
    > >
    > >
    > >>>>You can still rely on a staging table into which you import text if
    > >>>>needed, and you may need to be careful with the dates, because the
    > >>>>format aa/bb/cc is ambiguous.
    > >>>>
    > >>>>SK
    > >>>>
    > >>>>
    > >>>>Ian wrote:
    > >>>>
    > >>>>
    > >>>>
    > >>>>
    > >>>>
    > >>>>>Hi Steve
    > >>>>>
    > >>>>>Thanks for your time.
    > >>>>>
    > >>>>>I have read the code you sent.
    > >>>>>But I am not sure that it will cater for the fact that the first row

    in
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>the
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>Spread sheet has the field names.
    > >>>>>
    > >>>>>The spread sheet in fact is used by people and a VB application

    before
    > >>>>>
    > >>>>>

    > >it
    > >
    > >
    > >>>>>
    > >>>>>
    > >>>is
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>imported by my Stored Procedure and they need to know the column

    names.
    > >>>>> A B C
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>D
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>E
    > >>>>>1 MyID TextField DateField

    IntField
    > >>>>>FloatField
    > >>>>>2 1 Ian One 01/04/04
    > >>>>>
    > >>>>>

    > >10
    > >
    > >
    > >>>>>10.0304455900
    > >>>>>3 2 Ian Two 02/04/04

    20
    > >>>>>20.0304455900
    > >>>>>
    > >>>>>Sorry but the lay out of the sample data got a little screwed up when

    I
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>sent
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>it. I hope this time it looks more accurate.
    > >>>>>Above is what it should have looked like.
    > >>>>>
    > >>>>>What you have got here is really well thought up and actually might
    > >>>>>
    > >>>>>

    > >have
    > >
    > >
    > >>>>>solved another of my problems.
    > >>>>>If I am reading the code right then I think what it is doing is
    > >>>>>
    > >>>>>

    > >thinking
    > >
    > >
    > >>>>>
    > >>>>>
    > >>>all
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>the data and column names are in the first column. so that is where

    you
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>get
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>your single column from in the staging table. Then you select the 5
    > >>>>>
    > >>>>>

    > >rows
    > >
    > >
    > >>>>>
    > >>>>>
    > >>>in
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>the staging table to make up each record.
    > >>>>>
    > >>>>>
    > >>>>>Why is it that the registry has to be changed.
    > >>>>>I ask because this is for a work server.
    > >>>>>If it is the only why to import data from Excel as it's correct data
    > >>>>>
    > >>>>>

    > >type
    > >
    > >
    > >>>>>then I will do it.
    > >>>>>
    > >>>>>
    > >>>>>Ian
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>"Steve Kass" wrote in message
    > >>>>>news:eG%23FAAkeEHA.2044@TK2MSFTNGP10.phx.gbl...
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>>Ian,
    > >>>>>>
    > >>>>>>You can import Excel data conveniently with OpenRowSet. Here is a
    > >>>>>>script that should be close to what you need. You may need to

    modify
    > >>>>>>some registry values so that the mixed-type column will be imported

    as
    > >>>>>>text. See

    >
    >>>>>>http://groups.google.com/groups?q=29...8-39393E666E76
    > >>>>>>for relevant threads on this.
    > >>>>>>
    > >>>>>>set nocount on
    > >>>>>>go
    > >>>>>>
    > >>>>>>-- modify registry entries
    > >>>>>>Set
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>

    >
    >>>>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRow

    s
    > >>>>
    > >>>>
    > >>>>>
    > >>>>>
    > >>>>>>to 20
    > >>>>>>Set
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>

    >
    >>>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTy

    p
    > >>>
    > >>>

    > >e
    > >
    > >
    > >>>>
    > >>>>
    > >>>s
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>
    > >>>>>
    > >>>>>>to 'Text'
    > >>>>>>
    > >>>>>>-- specify IMEX=1 in the connection string of OpenRowSet
    > >>>>>>-- don't ask what this does - there's virtually no documentation of

    it
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>>create table Staging (
    > >>>>>>excelRow int identity(1,1) primary key,
    > >>>>>>s varchar(100)
    > >>>>>>)
    > >>>>>>
    > >>>>>>insert into Staging
    > >>>>>>select F1 from OpenRowSet(
    > >>>>>>'Microsoft.Jet.OLEDB.4.0',
    > >>>>>>'Excel 8.0;Database=E:\excel\Blocks.xls;HDR=NO;IMEX=1'
    > >>>>>>,Sheet1$
    > >>>>>>)
    > >>>>>>go
    > >>>>>>
    > >>>>>>create table Data (
    > >>>>>>pk int not null primary key,
    > >>>>>>tx varchar(20), -- increase from 80 as needed
    > >>>>>>dt datetime,
    > >>>>>>n integer,
    > >>>>>>f float
    > >>>>>>)
    > >>>>>>
    > >>>>>>-- if there are blank rows higher up than
    > >>>>>>-- the row before #1, change this appropriately
    > >>>>>>declare @start int
    > >>>>>>set @start = (
    > >>>>>>select min(excelRow)
    > >>>>>>from Staging
    > >>>>>>where s is null
    > >>>>>>)
    > >>>>>>declare @blocksize int
    > >>>>>>set @blocksize = (
    > >>>>>>select min(excelRow) - @start
    > >>>>>>from Staging
    > >>>>>>where s is null and excelRow > @start
    > >>>>>>)
    > >>>>>>set @start = @start + 1
    > >>>>>>
    > >>>>>>
    > >>>>>>insert into Data
    > >>>>>>select
    > >>>>>>(select s from Staging where excelRow = A.Block),
    > >>>>>>(select s -- set datetime mdy or dmy previously if needed
    > >>>>>> from Staging where excelRow = A.Block+1),
    > >>>>>>(select s from Staging where excelRow = A.Block+2),
    > >>>>>>(select s from Staging where excelRow = A.Block+3),
    > >>>>>>(select s from Staging where excelRow = A.Block+4)
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>from (
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>>select distinct excelRow as Block
    > >>>>>>from Staging
    > >>>>>>where (excelRow - @start) % @blocksize = 0
    > >>>>>>and excelRow >= @start
    > >>>>>>) A
    > >>>>>>go
    > >>>>>>
    > >>>>>>select * from Data
    > >>>>>>
    > >>>>>>go
    > >>>>>>
    > >>>>>>SK
    > >>>>>>
    > >>>>>>drop table Staging, Data
    > >>>>>>
    > >>>>>>Ian wrote:
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>>Hi All
    > >>>>>>>
    > >>>>>>>I have a excel spread sheet that i need data from. This is the

    Data.
    > >>>>>>>
    > >>>>>>>
    > >>>>>>> MyID
    > >>>>>>> TextField
    > >>>>>>> DateField
    > >>>>>>> IntField
    > >>>>>>> FloatField
    > >>>>>>>
    > >>>>>>> 1
    > >>>>>>> Ian One
    > >>>>>>> 01/04/04
    > >>>>>>> 10
    > >>>>>>> 10.0304455900
    > >>>>>>>
    > >>>>>>> 2
    > >>>>>>> Ian Two
    > >>>>>>> 02/04/04
    > >>>>>>> 20
    > >>>>>>> 20.0304455900
    > >>>>>>>
    > >>>>>>> 3
    > >>>>>>> Ian Three
    > >>>>>>> 03/04/04
    > >>>>>>> 30
    > >>>>>>> 30.0304455900
    > >>>>>>>
    > >>>>>>> 4
    > >>>>>>> Ian Four
    > >>>>>>> 04/04/04
    > >>>>>>> 40
    > >>>>>>> 40.0304455900
    > >>>>>>>
    > >>>>>>> 5
    > >>>>>>> Ian Five
    > >>>>>>> 05/04/04
    > >>>>>>> 50
    > >>>>>>> 50.0304455900
    > >>>>>>>
    > >>>>>>> 6
    > >>>>>>> Ian Six
    > >>>>>>> 06/04/04
    > >>>>>>> 60
    > >>>>>>> 60.0304455900
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>I have a table call tbl_Import which is built based on the field
    > >>>>>>>
    > >>>>>>>

    > >names
    > >
    > >
    > >>>>>>>above the data.
    > >>>>>>>MyID - Int
    > >>>>>>>TextField - Varchar
    > >>>>>>>DateField - DateTime
    > >>>>>>>IntField - Int
    > >>>>>>>FloatField - Float.
    > >>>>>>>
    > >>>>>>>I have tried 2 different methods for getting this data in to the
    > >>>>>>>
    > >>>>>>>

    > >table
    > >
    > >
    > >>>>>>>correctly.
    > >>>>>>>
    > >>>>>>>First
    > >>>>>>>
    > >>>>>>>Declare @ExcelSource as Varchar(255)
    > >>>>>>>SET @ExcelSource ='\\Server\RPT\TestImport.xls'
    > >>>>>>>
    > >>>>>>>Insert Into tbl_Import
    > >>>>>>>SELECT * FROM
    > >>>>>>>OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data
    > >>>>>>>Source="\\Server\RPT\TestImport.xls";User

    ID=Admin;Password=;Extended
    > >>>>>>>properties=Excel 5.0')...Import_Data
    > >>>>>>>
    > >>>>>>>Select * from tbl_Import
    > >>>>>>>
    > >>>>>>>Delete from tbl_Import
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>This method gives me the following error message.
    > >>>>>>>
    > >>>>>>>"Error converting data type nvarchar to float."
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>So i then change the data type in the table to VarChar on the Fload
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>field
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>>>And it does the import but the data columns are all out of order in
    > >>>>>>>
    > >>>>>>>

    > >the
    > >
    > >
    > >>>>>>>tables like it just guest them.
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>SECOND
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>BULK INSERT tbl_Import
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>FROM '\\Server\RPT\TestImport.xls'
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>
    > >>>>>>>WITH
    > >>>>>>> (
    > >>>>>>> FIELDTERMINATOR = '\t',
    > >>>>>>>ROWTERMINATOR = '\n',
    > >>>>>>>DATAFILETYPE = 'char'
    > >>>>>>> )
    > >>>>>>>
    > >>>>>>>Select * from tbl_Import
    > >>>>>>>
    > >>>>>>>Delete from tbl_Import
    > >>>>>>>
    > >>>>>>>And i get this message.
    > >>>>>>>
    > >>>>>>>"Bulk insert data conversion error (type mismatch) for row 1,

    column
    > >>>>>>>
    > >>>>>>>

    > >1
    > >
    > >
    > >>>>>>>(MyID)."
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>Is there a better easer why of doing this that acktualy works.
    > >>>>>>>
    > >>>>>>>I will be need ing to include it into a Stored Procedure once i

    have
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>got
    > >>>
    > >>>
    > >>>
    > >>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>it
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>>>importing the data corectly.
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>Ian
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>>>
    > >>>
    > >>>
    > >>>
    > >>>

    > >
    > >
    > >
    > >
    > >SQL Table Output
    > >
    > >FloatField TextFloatField TextFloatFieldTwo
    > >10.03115 10.0312 198.000
    > >20.030000000000001 20.03 45
    > >30.030445499999999 30.0304 255.783
    > >40.030445589999999 40.0304 455.009
    > >50.030422199999997 50.0304 10.000
    > >60.030439999999999 60.0304 019.020
    > >
    > >
    > >Format Float Format Varchar Format Varchar
    > >
    > >
    > >
    > >
    > >
    > >Excel Input
    > >
    > >FloatField TextFloatField TextFloatFieldTwo
    > >10.03115 10.03115 198.000
    > >20.03 20.03 45
    > >30.0304455 30.0304455 255.783
    > >40.03044559 40.03044559 455.009
    > >50.0304222 50.0304222 10.000
    > >60.03044 60.03044 019.020
    > >
    > >Format General Format General Format Text
    > >
    > >




  2. Help: Best way to Import data from EXCEL using a TSQL

    Hi,

    I am trying to import data from excel using tsql and using the openrowset as
    shown below. However, when I execute the command through query analyzer, I
    got the following error:

    Server: Msg 7399, Level 16, State 1, Line 1
    OLE DB provider 'Microsoft.Jet.OLEDB.4.0' reported an error. The provider
    did not give any information about the error.
    OLE DB error trace [OLE/DB Provider 'Microsoft.Jet.OLEDB.4.0'
    IDBInitialize::Initialize returned 0x80004005: The provider did not give any
    information about the error.].

    Actually, before i try openrowset, i try bulk insert command as well.
    However, since some fields value in the file to be imported into sql contain
    ",", so I found a field value like" syndey, nsw" is split into 2 columns. Do
    you have any advice on that? Thanks for your help in advance.

    Regards,

    Irene Cheng

    "Ian" wrote:

    > Thanks Steve
    >
    > That is great.
    >
    > Know i understand what is going on.
    >
    > Thanks heaps for your help.
    >
    > Ian
    >
    >
    >
    > "Steve Kass" wrote in message
    > news:eEsOoBveEHA.1652@TK2MSFTNGP09.phx.gbl...
    > > Ian,
    > >
    > > If you need to represent the value 20.03 exactly, then [float] is the
    > > wrong data type to use. The numbers [float] can represent exactly are a
    > > specific set of binary fractions, not decimal fractions. Because 20.03
    > > cannot be written exactly in the form /, [float]
    > > cannot store it exactly. SQL Server provides types to represent decimal
    > > fractions exactly: use DECIMAL(p,s) for precision p up to 38 and scale s
    > > between 0 and p. If you import the number 20.030000000000001 into a
    > > column of type, say, decimal(20, 8), it will be stored as 20.03 exactly.
    > >
    > > SK
    > >
    > > Ian wrote:
    > >
    > > >Hi Steve
    > > >
    > > >That is fantastic thank you for explaning that.
    > > >
    > > >This is what i have done.
    > > >
    > > >Insert Into tbl_Import
    > > >select MyID,TextField,DateField,IntField,FloatField,TextFloatField,
    > > >TextFloatFieldTwo
    > > >from OPENROWSET (
    > > > 'Microsoft.Jet.OLEDB.4.0',
    > > > 'Excel 5.0;Database=\\Server\RPT\TestImport.xls;HDR=YES;IMEX=1'
    > > > ,Import_Data
    > > >)
    > > >
    > > >Select * from tbl_Import
    > > >
    > > >Delete from tbl_Import
    > > >
    > > >
    > > >It does work. I have attached a small TXT file with the input and output
    > > >values whe using Decimales.
    > > >
    > > >In Excel the Value is 20.03 after import the float is 20.030000000000001
    > > >
    > > >As the out put showes i may have to format the excel worsheet to Text and
    > > >the import the data because i need it to be exact. i cannot have it

    > adding
    > > >fractions to my input.
    > > >
    > > >
    > > >
    > > >Again. Thank you for you
    > > >
    > > >Ian
    > > >
    > > >
    > > >
    > > >
    > > >
    > > >
    > > >
    > > >"Steve Kass" wrote in message
    > > >news:O%23q8QKleEHA.720@TK2MSFTNGP11.phx.gbl...
    > > >
    > > >
    > > >>That's because you typed HDR=NO where I suggested HDR=YES. HDR means
    > > >>"header row", and you have a header row. You can also look at select *
    > > >>to see what the columns are, if there's still a problem, and for the
    > > >>record, the columns are automatically named F1, F2, F3, ... when you say
    > > >>HDR=NO.
    > > >>
    > > >>SK
    > > >>
    > > >>Ian wrote:
    > > >>
    > > >>
    > > >>
    > > >>>Hi Steve
    > > >>>
    > > >>>when i execut
    > > >>>
    > > >>>select MyID,TextField,DateField,IntField,FloatField
    > > >>>
    > > >>>
    > > >>>from OPENROWSET (
    > > >>
    > > >>
    > > >>> 'Microsoft.Jet.OLEDB.4.0',
    > > >>> 'Excel 8.0;Database=\\Server1\RPT\TestImport.xls;HDR=NO'
    > > >>> ,Import_Data
    > > >>>)
    > > >>>
    > > >>>I get this as an out put.
    > > >>>
    > > >>>
    > > >>>Server: Msg 207, Level 16, State 3, Line 34
    > > >>>Invalid column name 'MyID'.
    > > >>>Server: Msg 207, Level 16, State 1, Line 34
    > > >>>Invalid column name 'TextField'.
    > > >>>Server: Msg 207, Level 16, State 1, Line 34
    > > >>>Invalid column name 'DateField'.
    > > >>>Server: Msg 207, Level 16, State 1, Line 34
    > > >>>Invalid column name 'IntField'.
    > > >>>Server: Msg 207, Level 16, State 1, Line 34
    > > >>>Invalid column name 'FloatField'.
    > > >>>
    > > >>>
    > > >>>
    > > >>>BUT
    > > >>>
    > > >>>
    > > >>>When i do
    > > >>>
    > > >>>select MyID,TextField,DateField,IntField,FloatField
    > > >>>
    > > >>>
    > > >>>from OPENROWSET (
    > > >>
    > > >>
    > > >>> 'Microsoft.Jet.OLEDB.4.0',
    > > >>> 'Excel 5.0;Database=\\Server1\RPT\TestImport.xls;HDR=YES;IMEX=1'
    > > >>> ,Import_Data
    > > >>>)
    > > >>>
    > > >>>
    > > >>>Then it sort of works.
    > > >>>
    > > >>>It does select the data but some of it is not exact.
    > > >>>
    > > >>>Excel
    > > >>>30.030445111
    > > >>>
    > > >>>Selected it is
    > > >>>30.030445110999999
    > > >>>
    > > >>>And all the Integers
    > > >>>1
    > > >>>
    > > >>>becomes.
    > > >>>1.0
    > > >>>
    > > >>>
    > > >>>Is there some thing else i need to set.
    > > >>>
    > > >>>
    > > >>>Ian
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>"Steve Kass" wrote in message
    > > >>>news:uWvJ1xkeEHA.720@TK2MSFTNGP11.phx.gbl...
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>Ian,
    > > >>>>
    > > >>>> It's much easier if this is in the form of a table. This should
    > > >>>>select the information:
    > > >>>>
    > > >>>>select MyID, TextField, DateField, IntField, FloatField
    > > >>>>
    > > >>>>
    > > >>>>from OpenRowSet(
    > > >>>
    > > >>>
    > > >>>> 'Microsoft.Jet.OLEDB.4.0',
    > > >>>> 'Excel 8.0;Database=E:\excel\Blocks.xls;HDR=YES'
    > > >>>> ,Sheet1$
    > > >>>>)
    > > >>>>
    > > >>>>if you use the appropriate file name. There should be no reason to
    > > >>>>modify the registry in this case, but sometimes you will get

    > additional
    > > >>>>blank rows imported below the data and you can make the change if need
    > > >>>>be. The reason for the changes, if needed, are because the Excel data
    > > >>>>provider has various options that are controlled by the registry
    > > >>>>
    > > >>>>
    > > >entries.
    > > >
    > > >
    > > >>>>You can still rely on a staging table into which you import text if
    > > >>>>needed, and you may need to be careful with the dates, because the
    > > >>>>format aa/bb/cc is ambiguous.
    > > >>>>
    > > >>>>SK
    > > >>>>
    > > >>>>
    > > >>>>Ian wrote:
    > > >>>>
    > > >>>>
    > > >>>>
    > > >>>>
    > > >>>>
    > > >>>>>Hi Steve
    > > >>>>>
    > > >>>>>Thanks for your time.
    > > >>>>>
    > > >>>>>I have read the code you sent.
    > > >>>>>But I am not sure that it will cater for the fact that the first row

    > in
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>the
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>Spread sheet has the field names.
    > > >>>>>
    > > >>>>>The spread sheet in fact is used by people and a VB application

    > before
    > > >>>>>
    > > >>>>>
    > > >it
    > > >
    > > >
    > > >>>>>
    > > >>>>>
    > > >>>is
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>imported by my Stored Procedure and they need to know the column

    > names.
    > > >>>>> A B C
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>D
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>E
    > > >>>>>1 MyID TextField DateField

    > IntField
    > > >>>>>FloatField
    > > >>>>>2 1 Ian One 01/04/04
    > > >>>>>
    > > >>>>>
    > > >10
    > > >
    > > >
    > > >>>>>10.0304455900
    > > >>>>>3 2 Ian Two 02/04/04

    > 20
    > > >>>>>20.0304455900
    > > >>>>>
    > > >>>>>Sorry but the lay out of the sample data got a little screwed up when

    > I
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>sent
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>it. I hope this time it looks more accurate.
    > > >>>>>Above is what it should have looked like.
    > > >>>>>
    > > >>>>>What you have got here is really well thought up and actually might
    > > >>>>>
    > > >>>>>
    > > >have
    > > >
    > > >
    > > >>>>>solved another of my problems.
    > > >>>>>If I am reading the code right then I think what it is doing is
    > > >>>>>
    > > >>>>>
    > > >thinking
    > > >
    > > >
    > > >>>>>
    > > >>>>>
    > > >>>all
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>the data and column names are in the first column. so that is where

    > you
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>get
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>your single column from in the staging table. Then you select the 5
    > > >>>>>
    > > >>>>>
    > > >rows
    > > >
    > > >
    > > >>>>>
    > > >>>>>
    > > >>>in
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>the staging table to make up each record.
    > > >>>>>
    > > >>>>>
    > > >>>>>Why is it that the registry has to be changed.
    > > >>>>>I ask because this is for a work server.
    > > >>>>>If it is the only why to import data from Excel as it's correct data
    > > >>>>>
    > > >>>>>
    > > >type
    > > >
    > > >
    > > >>>>>then I will do it.
    > > >>>>>
    > > >>>>>
    > > >>>>>Ian
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>"Steve Kass" wrote in message
    > > >>>>>news:eG%23FAAkeEHA.2044@TK2MSFTNGP10.phx.gbl...
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>>Ian,
    > > >>>>>>
    > > >>>>>>You can import Excel data conveniently with OpenRowSet. Here is a
    > > >>>>>>script that should be close to what you need. You may need to

    > modify
    > > >>>>>>some registry values so that the mixed-type column will be imported

    > as
    > > >>>>>>text. See

    > >
    > >>>>>>http://groups.google.com/groups?q=29...8-39393E666E76
    > > >>>>>>for relevant threads on this.
    > > >>>>>>
    > > >>>>>>set nocount on
    > > >>>>>>go
    > > >>>>>>
    > > >>>>>>-- modify registry entries
    > > >>>>>>Set
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>

    > >
    > >>>>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRow

    > s
    > > >>>>
    > > >>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>>to 20
    > > >>>>>>Set
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>

    > >
    > >>>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\ImportMixedTy

    > p
    > > >>>
    > > >>>
    > > >e
    > > >
    > > >
    > > >>>>
    > > >>>>
    > > >>>s
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>
    > > >>>>>
    > > >>>>>>to 'Text'
    > > >>>>>>
    > > >>>>>>-- specify IMEX=1 in the connection string of OpenRowSet
    > > >>>>>>-- don't ask what this does - there's virtually no documentation of

    > it
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>>create table Staging (
    > > >>>>>>excelRow int identity(1,1) primary key,
    > > >>>>>>s varchar(100)
    > > >>>>>>)
    > > >>>>>>
    > > >>>>>>insert into Staging
    > > >>>>>>select F1 from OpenRowSet(
    > > >>>>>>'Microsoft.Jet.OLEDB.4.0',
    > > >>>>>>'Excel 8.0;Database=E:\excel\Blocks.xls;HDR=NO;IMEX=1'
    > > >>>>>>,Sheet1$
    > > >>>>>>)
    > > >>>>>>go
    > > >>>>>>
    > > >>>>>>create table Data (
    > > >>>>>>pk int not null primary key,
    > > >>>>>>tx varchar(20), -- increase from 80 as needed
    > > >>>>>>dt datetime,
    > > >>>>>>n integer,
    > > >>>>>>f float
    > > >>>>>>)
    > > >>>>>>
    > > >>>>>>-- if there are blank rows higher up than
    > > >>>>>>-- the row before #1, change this appropriately
    > > >>>>>>declare @start int
    > > >>>>>>set @start = (
    > > >>>>>>select min(excelRow)
    > > >>>>>>from Staging
    > > >>>>>>where s is null
    > > >>>>>>)
    > > >>>>>>declare @blocksize int
    > > >>>>>>set @blocksize = (
    > > >>>>>>select min(excelRow) - @start
    > > >>>>>>from Staging
    > > >>>>>>where s is null and excelRow > @start
    > > >>>>>>)
    > > >>>>>>set @start = @start + 1
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>insert into Data
    > > >>>>>>select
    > > >>>>>>(select s from Staging where excelRow = A.Block),
    > > >>>>>>(select s -- set datetime mdy or dmy previously if needed
    > > >>>>>> from Staging where excelRow = A.Block+1),
    > > >>>>>>(select s from Staging where excelRow = A.Block+2),
    > > >>>>>>(select s from Staging where excelRow = A.Block+3),
    > > >>>>>>(select s from Staging where excelRow = A.Block+4)
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>from (
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>>select distinct excelRow as Block
    > > >>>>>>from Staging
    > > >>>>>>where (excelRow - @start) % @blocksize = 0
    > > >>>>>>and excelRow >= @start
    > > >>>>>>) A
    > > >>>>>>go
    > > >>>>>>
    > > >>>>>>select * from Data
    > > >>>>>>
    > > >>>>>>go
    > > >>>>>>
    > > >>>>>>SK
    > > >>>>>>
    > > >>>>>>drop table Staging, Data
    > > >>>>>>
    > > >>>>>>Ian wrote:
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>>Hi All
    > > >>>>>>>
    > > >>>>>>>I have a excel spread sheet that i need data from. This is the

    > Data.
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>> MyID
    > > >>>>>>> TextField
    > > >>>>>>> DateField
    > > >>>>>>> IntField
    > > >>>>>>> FloatField
    > > >>>>>>>
    > > >>>>>>> 1
    > > >>>>>>> Ian One
    > > >>>>>>> 01/04/04
    > > >>>>>>> 10
    > > >>>>>>> 10.0304455900
    > > >>>>>>>
    > > >>>>>>> 2
    > > >>>>>>> Ian Two
    > > >>>>>>> 02/04/04
    > > >>>>>>> 20
    > > >>>>>>> 20.0304455900
    > > >>>>>>>
    > > >>>>>>> 3
    > > >>>>>>> Ian Three
    > > >>>>>>> 03/04/04
    > > >>>>>>> 30
    > > >>>>>>> 30.0304455900
    > > >>>>>>>
    > > >>>>>>> 4
    > > >>>>>>> Ian Four
    > > >>>>>>> 04/04/04
    > > >>>>>>> 40
    > > >>>>>>> 40.0304455900
    > > >>>>>>>
    > > >>>>>>> 5
    > > >>>>>>> Ian Five
    > > >>>>>>> 05/04/04
    > > >>>>>>> 50
    > > >>>>>>> 50.0304455900
    > > >>>>>>>
    > > >>>>>>> 6
    > > >>>>>>> Ian Six
    > > >>>>>>> 06/04/04
    > > >>>>>>> 60
    > > >>>>>>> 60.0304455900
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>I have a table call tbl_Import which is built based on the field
    > > >>>>>>>
    > > >>>>>>>
    > > >names
    > > >
    > > >
    > > >>>>>>>above the data.
    > > >>>>>>>MyID - Int
    > > >>>>>>>TextField - Varchar
    > > >>>>>>>DateField - DateTime
    > > >>>>>>>IntField - Int
    > > >>>>>>>FloatField - Float.
    > > >>>>>>>
    > > >>>>>>>I have tried 2 different methods for getting this data in to the
    > > >>>>>>>
    > > >>>>>>>
    > > >table
    > > >
    > > >
    > > >>>>>>>correctly.
    > > >>>>>>>
    > > >>>>>>>First
    > > >>>>>>>
    > > >>>>>>>Declare @ExcelSource as Varchar(255)
    > > >>>>>>>SET @ExcelSource ='\\Server\RPT\TestImport.xls'
    > > >>>>>>>
    > > >>>>>>>Insert Into tbl_Import
    > > >>>>>>>SELECT * FROM
    > > >>>>>>>OpenDataSource('Microsoft.Jet.OLEDB.4.0', 'Data
    > > >>>>>>>Source="\\Server\RPT\TestImport.xls";User

    > ID=Admin;Password=;Extended
    > > >>>>>>>properties=Excel 5.0')...Import_Data
    > > >>>>>>>
    > > >>>>>>>Select * from tbl_Import
    > > >>>>>>>
    > > >>>>>>>Delete from tbl_Import
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>This method gives me the following error message.
    > > >>>>>>>
    > > >>>>>>>"Error converting data type nvarchar to float."
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>So i then change the data type in the table to VarChar on the Fload
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>field
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>>>And it does the import but the data columns are all out of order in
    > > >>>>>>>
    > > >>>>>>>
    > > >the
    > > >
    > > >
    > > >>>>>>>tables like it just guest them.
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>SECOND
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>BULK INSERT tbl_Import
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>FROM '\\Server\RPT\TestImport.xls'
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>
    > > >>>>>>>WITH
    > > >>>>>>> (
    > > >>>>>>> FIELDTERMINATOR = '\t',
    > > >>>>>>>ROWTERMINATOR = '\n',
    > > >>>>>>>DATAFILETYPE = 'char'
    > > >>>>>>> )
    > > >>>>>>>
    > > >>>>>>>Select * from tbl_Import
    > > >>>>>>>
    > > >>>>>>>Delete from tbl_Import
    > > >>>>>>>
    > > >>>>>>>And i get this message.
    > > >>>>>>>
    > > >>>>>>>"Bulk insert data conversion error (type mismatch) for row 1,

    > column
    > > >>>>>>>
    > > >>>>>>>
    > > >1
    > > >
    > > >
    > > >>>>>>>(MyID)."
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>Is there a better easer why of doing this that acktualy works.
    > > >>>>>>>
    > > >>>>>>>I will be need ing to include it into a Stored Procedure once i

    > have
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>got
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>it
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>>>importing the data corectly.
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>Ian
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>>>
    > > >>>
    > > >>>
    > > >>>
    > > >>>
    > > >
    > > >
    > > >
    > > >
    > > >SQL Table Output
    > > >
    > > >FloatField TextFloatField TextFloatFieldTwo
    > > >10.03115 10.0312 198.000
    > > >20.030000000000001 20.03 45
    > > >30.030445499999999 30.0304 255.783
    > > >40.030445589999999 40.0304 455.009
    > > >50.030422199999997 50.0304 10.000
    > > >60.030439999999999 60.0304 019.020
    > > >
    > > >
    > > >Format Float Format Varchar Format Varchar
    > > >
    > > >
    > > >
    > > >
    > > >
    > > >Excel Input
    > > >
    > > >FloatField TextFloatField TextFloatFieldTwo
    > > >10.03115 10.03115 198.000
    > > >20.03 20.03 45
    > > >30.0304455 30.0304455 255.783
    > > >40.03044559 40.03044559 455.009
    > > >50.0304222 50.0304222 10.000
    > > >60.03044 60.03044 019.020
    > > >
    > > >Format General Format General Format Text
    > > >
    > > >

    >
    >
    >


+ Reply to Thread
Page 2 of 2 FirstFirst 1 2