Einzelnen Beitrag anzeigen

ferby

Registriert seit: 15. Aug 2004
Ort: Wien
841 Beiträge
 
Delphi 2010 Enterprise
 
#1

[MSSQL 2005] Speed Problem mit Update Trigger

  Alt 4. Aug 2008, 15:02
Datenbank: SQL SERVER 2005 • Zugriff über: Management Studio
Hallo,

ich habe ein großes Performance Problem


Also folgendes: Ich möchte sehr sehr sehr viele Datensätze aus einen Excel in eine SQL Tabele übertragen.
Das ganze funktioniert schon recht gut (und schnell).

Das Problem ist jetzt, das viele dieser Datensätze falsch sind und auf richtigkeit überprüft werden müssen.

Ein Beispiel wäre, das ich alle Datensätze die ein NULL Element enthalten rauswerfen muss, oder
das bestimmte Datensätze überprüft werden müssen, ob keine Buchstaben drin vorkommen, etc.

Was auch wichtig ist, das, sobald ein Fehler in den Daten auftritt, dass das insert sofort mit einer Fehlermeldung abbricht.

Ich habe das ganze mit einen Update Trigger so gelößt:

SQL-Code:
ALTER TRIGGER [dbo].[dbo.tr_t_xl_costcenter_cost_upd] on [dbo].[t_xl_costcenter_cost]
AFTER INSERT NOT FOR REPLICATION
AS
BEGIN
   
   SET NOCOUNT ON
   
   DECLARE @Error_Message nvarchar(500)

   SET @Error_Message = NULL
   
   -- delete NULL Elements
   Delete
   from dbo.t_xl_costcenter_cost
   where
   KST + IAS10 + MO + AMOUNT is NULL

   -- check if KST is nummeric
   if (select KST from dbo.t_xl_costcenter_cost where isnumeric(KST)=0) is not Null
   SET @Error_Message='The KST ''' + (select KST from dbo.t_xl_costcenter_cost where isnumeric(KST)=0) + ''' is not valid!'
   

        -- [..] noch ca. 10 weitere fehlerüberprüfungen

   -- prepare error message
   SET @Error_Message =   CHAR(10)+ CHAR(10) + N'---------------------------' + CHAR(10) +
                     'IMPORT ERROR' + CHAR(10) + @Error_Message +
                     CHAR(10) + N'---------------------------' + CHAR(10) + CHAR(10)          

   -- throw error
   if @Error_Message is not NULL
   RAISERROR (@Error_Message, 11, 1)

END
Jedesmal wenn ein neuer Datensatz eingefügt wird, wird dieser validiert, wenn er falsch ist, bekommt der User eine Fehlermeldung um die Ohren.

Das Problem ist, das aber bei meiner Variante jedesmal ALLE Datensätze in der Datenbank Validiert werden.
Es kann aber immer nur der neueste falsch sein. Ich glaube daher braucht der SQL Server so lange.
(Wenn ich die Fehlerüberprüfungen raus nehme braucht er ca. 2 min, mit Fehlerüberprüfung 30min!)

Kennt jemand eine Methode, wie ich nur den aktuellen Datensatz prüfen kann (mit updated?!) und diesen Datensatz in die Tabelle aufnehme,
wenn er valide ist, ansosnten einen Error auslöse?


Mir fällt irgendwie nichts ein
  Mit Zitat antworten Zitat