[Home] Utilizare BULK INSERT


Exemplul urmator poate fi utilizat pentru analiza statistica a seriilor de numere
extrase la loto 6 din 49 pe parcursul mai multor ani.

Pentru a rula exemplul se vor executa urmatorii pasi: 1. Crearea tabelei cu cele 49 de numere

CREATE TABLE [numere]
(
     NR SMALLINT NOT NULL ,
     PRIMARY KEY CLUSTERED (NR)
)


Pentru a insera cele 49 de numere se utilizeaza script-ul:

DECLARE @i SMALLINT
SET @i = 1

WHILE @i < 50
BEGIN
     INSERT INTO [numere] VALUES (@i)
     SET @i =@i + 1
END

2. Tabela cu extragerile

CREATE TABLE [loto]
(
     [Data] SMALLDATETIME NOT NULL ,
     [n1] SMALLINT NULL ,
     [n2] SMALLINT NULL ,
     [n3] SMALLINT NULL ,
     [n4] SMALLINT NULL ,
     [n5] SMALLINT NULL ,
     [n6] SMALLINT NULL ,
     CONSTRAINT [PK_loto] PRIMARY KEY CLUSTERED([Data])
)

Fisierul cu extragerile loto de la 01 ianuarie 1998 pana in august 2002: loto.txt (datele din acest fisier sunt reale!!!).

Pentru a insera date in tabela [loto] se download-eaza fisierul loto.txt,
apoi se ruleaza scriptul urmator:

BULK INSERT bd_name.dbo.loto
FROM 'C:\loto\loto.txt'
WITH
(
    FIELDTERMINATOR = ',',
    ROWTERMINATOR = '\n'
)

Pentru a vedea datele din tabela [loto]: SELECT * FROM [loto].

3. Exemplu de procedura stocata pentru analiza datelor

CREATE PROCEDURE spGetAparitii
     @StartDate AS DATETIME,
     @ENDDate AS DATETIME
AS

SELECT Data, n1, n2, n3, n4, n5, n6 INTO #temp
FROM loto
WHERE (@StartDate <= CONVERT(varchar(10), Data, 111)) AND (CONVERT(varchar(10), Data, 111) < @ENDDate)

SELECT NR, aparitii = poz1 + poz2 + poz3 + poz4 + poz5 + poz6
FROM
(
     SELECT      NR = N.NR,
          poz1 = CASE WHEN A.aparitii IS NULL THEN 0 ELSE A.aparitii END,
          poz2 = CASE WHEN B.aparitii IS NULL THEN 0 ELSE B.aparitii END,
          poz3 = CASE WHEN C.aparitii IS NULL THEN 0 ELSE C.aparitii END,
          poz4 = CASE WHEN D.aparitii IS NULL THEN 0 ELSE D.aparitii END,
          poz5 = CASE WHEN E.aparitii IS NULL THEN 0 ELSE E.aparitii END,
          poz6 = CASE WHEN F.aparitii IS NULL THEN 0 ELSE F.aparitii END
     FROM
     (
          SELECT NR
          FROM numere
     ) AS N
     LEFT OUTER JOIN
     (
          SELECT n1, aparitii =COUNT(n1)
          FROM #temp
          GROUP BY n1
     ) AS A
     ON N.NR = A.n1
     LEFT OUTER JOIN
     (
          SELECT n2, aparitii =COUNT(n2)
          FROM #temp
          GROUP BY n2
     ) AS B
     ON N.NR = B.n2
     LEFT OUTER JOIN
     (
          SELECT n3, aparitii =COUNT(n3)
          FROM #temp
          GROUP BY n3
     ) AS C
     ON N.NR = C.n3
     LEFT OUTER JOIN
     (
          SELECT n4, aparitii =COUNT(n4)
          FROM #temp
          GROUP BY n4
     ) AS D
     ON N.NR = D.n4
    LEFT OUTER JOIN
     (
          SELECT n5, aparitii =COUNT(n5)
          FROM #temp
          GROUP BY n5
     ) AS E
     ON N.NR = E.n5
     LEFT OUTER JOIN
     (
          SELECT n6, aparitii =COUNT(n6)
          FROM #temp
          GROUP BY n6
     ) AS F
     ON N.NR = F.n6
) AS P

DROP TABLE #temp

GO


Această procedură returnează numărul de apariţii ale fiecărui număr extras pe intervalul de timp specificat.
Exemplu de utilizare:

spGetAparitii '1998/01/01', '2002/12/31'

NR aparitii
1 26
2 26
3 27
...