Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
Delphi XE2 Professional
|
AW: 100.000 Datensätze in 22 Minuten - geht das noch schneller?
18. Apr 2011, 13:07
Der Import der Daten erfolgt von einem Client (lässt sich nicht ändern). Die Daten kommen aus einer Textdatei (Semikolon getrennt).
Es wird nur eine SQL Tabelle verwendet, die nur einen Primärschlüssel besitzt.
Code:
...
CREATE TABLE [dbo].[mat_beweg](
[id] [int] IDENTITY(1,1) NOT NULL,
[snr] [nvarchar](9) NOT NULL,
[b_ftag] [nvarchar](4) NOT NULL,
[b_datum] [nvarchar](8) NOT NULL,
[b_art] [nvarchar](2) NULL,
[b_folge] [nvarchar](3) NULL,
[ktr] [nvarchar](9) NULL,
[znr] [nvarchar](3) NULL,
[sinr] [nvarchar](7) NULL,
[kst] [nvarchar](4) NULL,
[k_art] [nvarchar](2) NULL,
[umbnr] [nvarchar](5) NULL,
[kz_es] [nvarchar](1) NULL,
[bestand] [nvarchar](12) NULL,
[menge] [nvarchar](12) NULL,
[menge_storno] [nvarchar](12) NULL,
[wemnr] [nvarchar](6) NULL,
[bnr] [nvarchar](9) NULL,
[lnr] [nvarchar](11) NULL,
[preise] [nvarchar](2) NULL,
[bpreis] [nvarchar](10) NULL,
[preisart] [nvarchar](1) NULL,
[dpreis] [nvarchar](10) NULL,
[bwert] [nvarchar](11) NULL,
[buch_datum] [nvarchar](8) NULL,
[buch_grund] [nvarchar](20) NULL,
[buch_user] [nvarchar](8) NULL,
[zchnr] [nvarchar](38) NULL,
[benennung] [nvarchar](36) NULL,
[lieferant] [nvarchar](18) NULL,
[lastupdate] [datetime] NOT NULL,
CONSTRAINT [PK_mat_beweg] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Stored Procedure "UPSERT"
Code:
/****** Objekt: StoredProcedure [dbo].[sp_upsert] Skriptdatum: 04/18/2011 12:58:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_upsert]
-- Add the parameters for the stored procedure here
@snr nvarchar(9),
@b_ftag nvarchar(4),
@b_datum nvarchar(8),
...,
@lastupdate datetime
AS
SET transaction isolation level SERIALIZABLE
SET NOCOUNT ON
BEGIN TRANSACTION Upsert
update mat_beweg set snr = @snr,
b_ftag = @b_ftag,
b_datum = @b_datum,
...
lastupdate = @lastupdate
where snr = @snr
if @@rowcount = 0 and @@error=0
begin
insert into mat_beweg (snr, b_ftag, b_datum, ..., lastupdate)
values (@snr, @b_ftag, @b_datum, ..., @lastupdate)
end
COMMIT TRANSACTION Upsert
Aufruf aus dem Program
Delphi-Quellcode:
...
with sp_upsert do
begin
ProcedureName := 'sp_upsert';
// Parameter-Liste aktualisieren
Parameters.Refresh;
Prepared := True;
for i:=0 to 100000 do // symbolisch für die Datensätze
begin
Parameters.ParamValues['@snr'] := IntToStr(i);
Parameters.ParamValues['@b_ftag'] := '6272';
Parameters.ParamValues['@b_datum'] := '20110418';
Parameters.ParamValues['@lastupdate'] := Now;
...
ExecProc;
end;
Prepared := False;
end;
Das ganze ist nur ein einfacher Import (INSERT oder UPDATE). Ich hoffe die Infos sind ausreichend. Ein Merge funktioniert nicht, da ich SQL Server 2005 Express habe und die Funktion erst ab 2008 existiert.
|