Welcome to Sign in | Help
in Search

script de import din excel in SQL Server 2000

Last post 07-19-2007, 12:03 PM by B_gd_n[ ]Sahlean. 5 replies.
Sort Posts: Previous Next
  •  07-18-2007, 5:51 PM 2292

    script de import din excel in SQL Server 2000

    salut, ma ajutati si pe mine va rog sa fac un script (sau poate il aveti deja:) ) care sa-mi importe dintr-un fisier excel intr-o tabela (sql server 2000) dar sa faca si unele modificari

    sa va explic:

    am tabela urmatoare in sql:

    CREATE TABLE [dbo].[EQUIVAL] (
     [CURIDREF] [int] NOT NULL ,
     [RATEDATE] [datetime] NOT NULL ,
     [CURID] [int] NOT NULL ,
     [FIXINGRATE] [float] NOT NULL
    ) ON [PRIMARY]
    GO

    ALTER TABLE [dbo].[EQUIVAL] WITH NOCHECK ADD
     CONSTRAINT [PK_EQUIVAL] PRIMARY KEY  CLUSTERED
     (
      [CURIDREF],
      [RATEDATE],
      [CURID]
     )  ON [PRIMARY]
    GO

    si un fisier excel de forma:

    CURIDREF  RATEDATE         CURID   FIXINGRATE
    99  26 iun.2007 2 3.1816
    99  27 iun.2007 2 3.1699
    99  28 iun.2007 2 3.1661
    99  29 iun.2007 2 3.134
    99  2 iul.2007 2 3.1112
    99  3 iul.2007 2 3.1231
    99  4 iul.2007 2 3.1354
    99  5 iul.2007 2 3.1359
    99  6 iul.2007 2 3.1212
    99  9 iul.2007 2 3.1231
    99  10 iul.2007 2 3.1392
    99  11 iul.2007 2 3.1294
    99  12 iul.2007 2 3.137
    99  13 iul.2007 2 3.1348
    99  16 iul.2007 2 3.1295
    99  17 iul.2007 2 3.1285
    99  18 iul.2007 2 3.1289

    as avea nevoie de un script care sa-mi importe din acest fisier (cele 4 coloane) in tabela EQUIVAL singura modificare fiind la RATEDATE in sensul ca:

    a. daca in excel am data 4 iulie 2007 in registrarea respectiva sa o bage cu data 5 iulie 2007 (deci sa-mi adune o zi la data atunci cand fac importul)

    b. dupa cum se vede in excel lipsesc sambetele si duminicile (nu se genereaza curs de schimb valutar de catre bnr)...deci daca data de 5 iulie 2007 (joi) trebuie sa ajunga in baza de date cu data de 6 iulie 2007(vineri) atunci data de 6 iulie 2007 (vineri) din excel trebuie sa ajunga in tabela cu date de 7 iulie 2007(sambata) , cu date de 8 iulie 2007(duminica) si cu data de 9 iulie 2007 (luni).....si pe urma se repeta ciclul

    multumesc mult.

    alex.

  •  07-18-2007, 7:34 PM 2293 in reply to 2292

    Re: script de import din excel in SQL Server 2000

    Poti incerca sa-ti faci un integration services un package si sa-l rulezi apoi.E un caz clasic de etl extract transform load
    Secolul XXI ori va fi religios ori nu va fi deloc
  •  07-18-2007, 8:50 PM 2294 in reply to 2293

    Re: script de import din excel in SQL Server 2000

    [1] In versiunea SQL Server 2000 ai la dispozitie DTS - Data Transformation Services pentru exportul si importul datelor din / in SQL Server (incluziand aici importul intr-o baza de date SQL Server a datelor dintr-un workbook Excel). SQL Server Integration Services (SSIS) este urmaşul lui DTS.

     

    [2] Totusi solutia cea mai simpla pp. utilizarea functiei OPENROWSET:

     SELECT Q.*
    INTO tabel
    FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\Book1.xls', [Sheet1$]) AS Q

     

     [3] altele ...OpenDataSource , LinkedServer ...

     

  •  07-18-2007, 9:32 PM 2295 in reply to 2294

    Re: script de import din excel in SQL Server 2000

    ... iar pentru aflarea cursului BNR poti utiliza interogarea:

    CREATE Table Curs(DataCurs DATETIME, CursBNR MONEY)
    INSERT INTO Curs VALUES ('2007-01-01', 3.5555)
    INSERT INTO Curs VALUES ('2007-01-02', 3.4444)
    INSERT INTO Curs VALUES ('2007-01-03', 3.3333)
    INSERT INTO Curs VALUES ('2007-01-04', 3.2222)
    -- pp. 5 si 6 ca fiind zile de weekend
    INSERT INTO Curs VALUES ('2007-01-07', 3.1000)
    INSERT INTO Curs VALUES ('2007-01-08', 3.2000)
    INSERT INTO Curs VALUES ('2007-01-09', 3.3000)

    DECLARE @dt AS DATETIME
    SET @dt = '2007-01-06'


    --interogarea propriu-zisa

    SELECT CursBNR
    FROM Curs
    WHERE DataCurs = (SELECT MAX(DataCurs) FROM Curs WHERE DataCurs <= @dt)

     

    Aceasta interogare returneaza valoarea 3.2222 adica tocmai valoarea cursului BNR din data de 2007-01-04.

    Concluzie: nu va fi necesar sa se realizeza alte modificari asupra datelor importate din Excel. 

    Evident ca poti realiza o functie cu un parametru @dt care sa returneaza valoarea cursului BNR valabil la data respectiva. 

  •  07-19-2007, 10:27 AM 2296 in reply to 2295

    Re: script de import din excel in SQL Server 2000

    multumesc pt raspunsuri

    interogarea tabelei care contine cursul de referinta este deja facuta si nu poate fi modificata....deci nu pot folosi scriptul tau cu Max(DataCurs)...ar fi fost interesant asa cum zici tu....interogarea deja existenta citeste cursul din ziua respectiva....si daca nu gaseste ziua respectiva in tabela nu stie sa ia un MAX(dataCurs) where DataCUrs <= @variabila....

    in concluzie....pentru ca nu gasesc o varianta mai simpla  o sa fac asa:

    1.imi creez o tabela cu aceeasi structura...sa-i zicem EquivalTemporar

    2.in Enterprise manager cu Import Data...aduc datele din Excel in EquivalTemporar

    3.rulez un Update pe EquivalTemporar:

    update EquivalTemporar
    set ratedate = ratedate+1

    4.introduc manual zilele de sambata si duminica :) .....momentan......(pana reusesc sa fac un script de Update)

    5.apoi le mut in tabela EQUIVAL

    insert into EQUIVAL Values (CURIDREF,RATEDATE,CURID,FIXINGRATE)
    select * from EquivalTemporar

    delete from EquivalTemporar

    si cam atat......bineinteles ca solutia mea e una din "topor" clar :)...dar e singura pe care o am si care-mi vine in minte acum

    multumesc mult.

    alex.

     

  •  07-19-2007, 12:03 PM 2297 in reply to 2296

    Re: script de import din excel in SQL Server 2000

    Inserare date lipsa (O SOLUTIE):

     --DROP TABLE Curs
    CREATE TABLE Curs (DataCurs DATETIME PRIMARY KEY, CursBNR MONEY)
    INSERT INTO Curs VALUES ('2007-01-01',3.8888)
    INSERT INTO Curs VALUES ('2007-01-02',3.7777)
    INSERT INTO Curs VALUES ('2007-01-03',3.5555)
    --lipsa 4 si 5
    INSERT INTO Curs VALUES ('2007-01-06',3.4000)
    INSERT INTO Curs VALUES ('2007-01-07',3.3000)
    INSERT INTO Curs VALUES ('2007-01-08',3.2000)
    --lipsa 9, 10, 11, 12, 13
    INSERT INTO Curs VALUES ('2007-01-14',3.1010)
    INSERT INTO Curs VALUES ('2007-01-15',3.2020)
    --reset table DELETE FROM Curs WHERE DAY(DataCurs) IN (4,5,9,10,11,12,13)


    DECLARE @tbl TABLE (DataCurs DATETIME, NrZileDif INT)

    INSERT INTO @tbl
    SELECT T1.DataCurs , DATEDIFF(dd,T1.DataCurs,T2.DataCurs)-1 AS NrZileDif
    FROM
    (SELECT Q1.DataCurs , COUNT(*) AS Nr
    FROM
    (SELECT TOP 100 PERCENT DataCurs FROM Curs ORDER BY DataCurs) AS Q1
    INNER JOIN
    (SELECT TOP 100 PERCENT DataCurs FROM Curs ORDER BY DataCurs) AS Q2
    ON Q1.DataCurs > Q2.DataCurs
    GROUP BY Q1.DataCurs) AS T1

    INNER JOIN

    (SELECT Q1.DataCurs , COUNT(*) AS Nr
    FROM
    (SELECT TOP 100 PERCENT DataCurs FROM Curs ORDER BY DataCurs) AS Q1
    INNER JOIN
    (SELECT TOP 100 PERCENT DataCurs FROM Curs ORDER BY DataCurs) AS Q2
    ON Q1.DataCurs > Q2.DataCurs
    GROUP BY Q1.DataCurs) AS T2

    ON T1.Nr+1 = T2.Nr AND DATEADD(dd,1,T1.DataCurs) <> T2.DataCurs

    --un select cu datele lipsa
    /*
    SELECT Q.DataLipsa ,
        (SELECT TOP 1 DataCurs FROM Curs WHERE DataCurs = (SELECT MAX(DataCurs) FROM Curs WHERE DataCurs < Q.DataLipsa )) AS DataReper,
        (SELECT TOP 1 CursBNR FROM Curs WHERE DataCurs = (SELECT MAX(DataCurs) FROM Curs WHERE DataCurs < Q.DataLipsa )) AS CursReper
    FROM
    (
    SELECT DATEADD(dd,1,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 1
    UNION
    SELECT DATEADD(dd,2,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 2
    UNION
    SELECT DATEADD(dd,3,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 3
    UNION
    SELECT DATEADD(dd,4,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 4
    UNION
    SELECT DATEADD(dd,5,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 5
    UNION
    SELECT DATEADD(dd,6,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 6
    UNION
    SELECT DATEADD(dd,7,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif = 7
    ) AS Q
    */


    --datele lipsa sunt inserate in tabela Curs
    INSERT INTO Curs (DataCurs,CursBNR)
    SELECT Q.DataLipsa ,
        (SELECT TOP 1 CursBNR FROM Curs WHERE DataCurs = (SELECT MAX(DataCurs) FROM Curs WHERE DataCurs < Q.DataLipsa )) AS CursReper
    FROM
    (
    SELECT DATEADD(dd,1,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 1
    UNION
    SELECT DATEADD(dd,2,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 2
    UNION
    SELECT DATEADD(dd,3,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 3
    UNION
    SELECT DATEADD(dd,4,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 4
    UNION
    SELECT DATEADD(dd,5,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 5
    UNION
    SELECT DATEADD(dd,6,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif >= 6
    UNION
    SELECT DATEADD(dd,7,V.DataCurs) AS DataLipsa FROM @tbl V WHERE V.NrZileDif = 7
    ) AS Q

    SELECT *
    FROM Curs
    ORDER BY DataCurs

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems