Forums Neueste Beiträge
 

gespeicherte Prozedur...

20/05/2009 - 11:15 von Volker Scherf | Report spam
Hallo NG,
ich weiß net so recht wie ich es im Betreff formulieren sollte. Also:
Ich hab über einen SQL Server-Agenten einen Auftrag laufen, der alle 15 min
eine Prozedur ausführen soll.
In dieser Prozedur werden die Daten in einer Tabelle gelöscht und danach mit
neuen Daten befüllt.
Nun dauert es aber einige Zeit, bis die Daten, welche eingefügt werden
sollen, bereit stehen (so ca. 9 sec), da diese von zwei Sichten kommen,
welche von zwei Tabellen (so ca. 700.000 DS) aus einer Oracle-DB stammen.
Da aber die Tabelle, in welche die Daten eingefügt werden sollen, bereits
leer ist, kann es nun passieren, das der Benutzer, der in diesem Moment auf
die Daten zugreifen möchte nix sieht.
Die Frage ist nun, wie ich das am besten umgehen kann. Mit Prozeduren hab
ich bisher noch nicht so viel am Hut gehabt, das ist ein bissel Neuland für
mich.
Ich dacht mir schon, dass ich die Daten aus der Oracle-DB zuerst abrufe,
dann in eine Hilfstabelle schreib, dann die Daten in der anderen lösche und
danach die Daten aus der Hilfstabelle übertrage. Das geht ja wesentlich
flotter, da es nur so um die 100 DS sind. Dieser Weg erscheint mir aber
etwas umstàndlich. Vielleicht hat ja jemand einen eleganteren Ansatz.

System: SQL-Server 2005

Anbei der Code:
#####
ALTER PROCEDURE [dbo].[SGM_GESAMTSCHUSS_IN_TABELLE]
AS
DECLARE @FMeldung varchar(50)
BEGIN
SET NOCOUNT ON;
DELETE FROM tbl_Schusszaehler

IF @@ERROR > 0
BEGIN
SET @FMeldung = 'Fehler beim Löschen der Datensàtze
(tbl_Schusszaehler)!'
END
INSERT tbl_schusszaehler (MASCHINE,
SCHUSS_ALLE,
SCHUSS_AUFTRAG,
GESAMTSCHUSS,
ISTZYKLUS,
ISTSTUECK,
AUSSCHUSS,
SOLLSTUECK,
WERKZEUG,
AENDE,
AUFTRAG,
STILLDAUER,
SOLLZYKLUS,
KAVITAET,
STAND)
SELECT dbo.PROSES_TBL_SGM_SCHUSS_GESAMT.MASCHINE,
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_GESAMT.SCHUSS, 0) AS SCHUSS_ALLE,
ROUND(ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.Schuss, 0), 0) AS
SCHUSS_AUFTRAG,
dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.Schuss +
dbo.PROSES_TBL_SGM_SCHUSS_GESAMT.SCHUSS AS GESAMTSCHUSS,
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.ISTZYKLUS,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.ISTSTUECK,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.AUSSCHUSS,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.SOLLSTUECK,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.WERKZEUG,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.AENDE,GETDATE()),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.AUFTRAG,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.STILLDAUER,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.SOLLZYKLUS,0),
ISNULL(dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.KAVITAET,0),
GETDATE() AS STAND
FROM dbo.PROSES_TBL_SGM_SCHUSS_AKTIV RIGHT OUTER JOIN
dbo.PROSES_TBL_SGM_SCHUSS_GESAMT ON
dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.MASCHINE =
dbo.PROSES_TBL_SGM_SCHUSS_GESAMT.MASCHINE
ORDER BY dbo.PROSES_TBL_SGM_SCHUSS_AKTIV.MASCHINE

IF @@ERROR >0
BEGIN
SET @FMeldung = 'Fehler beim Schreiben der Datenstze
(tbl_Schusszaehler)'
END

SELECT 'Daten wurden erfolgreich geschrieben'
GOTO ExitHere

Fehler:
RAISERROR (@fmeldung,12,1)
ROLLBACK TRANSACTION

ExitHere:
END
#####


Viele Grüße,
Volker Scherf
 

Lesen sie die antworten

#1 Christa Kurschat
20/05/2009 - 11:43 | Warnen spam
Hallo Volker,

"Volker Scherf" schrieb im Newsbeitrag
news:gv0hnv$qkb$
Hallo NG,
ich weiß net so recht wie ich es im Betreff formulieren sollte. Also:
Ich hab über einen SQL Server-Agenten einen Auftrag laufen, der alle 15
min eine Prozedur ausführen soll.
In dieser Prozedur werden die Daten in einer Tabelle gelöscht und danach
mit neuen Daten befüllt.
Nun dauert es aber einige Zeit, bis die Daten, welche eingefügt werden
sollen, bereit stehen (so ca. 9 sec), da diese von zwei Sichten kommen,
welche von zwei Tabellen (so ca. 700.000 DS) aus einer Oracle-DB stammen.
Da aber die Tabelle, in welche die Daten eingefügt werden sollen, bereits
leer ist, kann es nun passieren, das der Benutzer, der in diesem Moment
auf die Daten zugreifen möchte nix sieht.
Die Frage ist nun, wie ich das am besten umgehen kann. Mit Prozeduren hab
ich bisher noch nicht so viel am Hut gehabt, das ist ein bissel Neuland
für mich.
Ich dacht mir schon, dass ich die Daten aus der Oracle-DB zuerst abrufe,
dann in eine Hilfstabelle schreib, dann die Daten in der anderen lösche
und danach die Daten aus der Hilfstabelle übertrage. Das geht ja
wesentlich flotter, da es nur so um die 100 DS sind. Dieser Weg erscheint
mir aber etwas umstàndlich. Vielleicht hat ja jemand einen eleganteren
Ansatz.



Das mag zwar umstàndlich klingen, aber ich würde es auch so machen.
Damit bist Du auf jeden Fall auf der sicheren Seite, falls beim Import mal
was schiefgeht.

Gruß
Christa
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
InsideSql: www.insidesql.org

Ähnliche fragen