Moin zusammen,
ich habe mir heute die Stored Procedures angesehen, da ich demnächst einen Datenimport von mehr als 1.000.000 Datensätzen vornehmen muss.
Meine Test "UPSERT" Prozedure sieht wie folgt aus.
Delphi-Quellcode:
USE [KECDB_TEST]
GO
/****** Objekt: StoredProcedure [dbo].[sp_upsert] Skriptdatum: 04/18/2011 08:11:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[sp_upsert]
-- Add the parameters for the stored procedure here
@snr nvarchar(9),
@b_ftag nvarchar(4),
@b_datum nvarchar(8)
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
where snr = @snr
if @@rowcount = 0 and @@error=0
begin
insert into mat_beweg (snr, b_ftag, b_datum)
values (@snr, @b_ftag, @b_datum)
end
COMMIT TRANSACTION Upsert
Wenn ich die Prozedure im MS
SQL Server Management Studio ausführe, funktioniert alles besten. Wenn ich es die Prozedure im Program aufrufe, siehe Quellcode unten, kam ein Fehler.
Zitat:
Die Prozedur oder Funktion 'sp_upsert' erwartet den '@snr'-Parameter, der nicht bereitgestellt wurde.
Dazu habe ich folgenden Artikel hier im Forum gefunden, der mein Problem erklärt.
http://www.delphipraxis.net/107836-f...tgestellt.html
Mein Program sieht jetzt wie folgt aus und funktioniert.
Delphi-Quellcode:
ConnectToSQLServer;
// Funktion zum Aufbau der SQL Verbindung
...
with sp_upsert
do
begin
ProcedureName := '
sp_upsert';
Prepared;
// ---> 1. Versuch: Resultat: Fehler
// Parameters.ParamByName('snr').Value := '210210210';
// Parameters.ParamByName('b_ftag').Value := '6272';
// Parameters.ParamByName('b_datum').Value := '20110418';
// ---> 2. Versuch: Resultat: Fehler
// Parameters.ParamValues['@snr'] := '210210210';
// Parameters.ParamValues['@b_ftag'] := '6272';
// Parameters.ParamValues['@b_datum'] := '20110418';
// ---> 3. Versuch: alles OK
for i := 0
to 10000
do
begin
Parameters.Clear;
Parameters.CreateParameter('
@snr', ftString, pdInput, 9, IntToStr(i));
Parameters.CreateParameter('
@b_ftag', ftString, pdInput, 4, '
6272');
Parameters.CreateParameter('
@b_datum', ftString, pdInput, 8, FormatDateTime('
hh:nn:ss', now));
ExecProc;
end;
end;
Was ich nicht verstehe, warum muss man die Parameter erstellen? Sie sind doch schon laut sp_upsert Prozedure definiert und man müsst doch ohne weiteres darauf zu greifen können, wie Versuch 1-2 zeigen.
Wäre nett, wenn mir dazu einer eine kleine Erklärung geben könnte. Eventuell ist ja der Quellcode aus dem 3. Versuch nicht wirklich die Lösung und es geht noch besser.
Danke im Voraus.
Sven