net-tobi Geschrieben 11. März 2010 Teilen Geschrieben 11. März 2010 Hallo zusammen Ich habe ein problem mit einer If-Anweisung, hier schlägt der vergleich fehl. Als ergebnis bekomme ich immer false. Nun aber zu den Fakten damit ihr hier nicht in die Glaskugel schauen müsst. Die Datenbank läuft auf einen SQL Server 2005 und die Management Console. Ich schreibe auch hier die Abfrage. Ziel der Abfrage ist es aus 3 Tabellen 2 Variablen zu füllen die dann Verglichen werden sollen über die If anweisung. Die erste Tabelle durchlaufe ich mit einem cursor und hole mir ein Objekt, mit diesen suche ich dann in den anderen beiden Tabellen und fülle die beiden Variablen. Nennen wir sie V1 und V2 Die Anweisung lautet wie folgt: IF V1 = V2 @zähler = @zähler +1 Der Zähler soll dann am schluss das Ergebnis mit den gleichen Datensätzen anzeigen. Das füllen der Variablen klappt problemlos. Nur an der If Anweisung verzeiflich langsam. Denn egal wie die Variablen sind hält das Script sie immer für ungleich. Ach ja die Variablen sind alle mit nvarchar (max) deglariert so sind diese auch in den Tabellen hinterlegt. Wenn ich mir die Variablen anzeigenlasse, über dir Print Anweisung dann sieht es so aus. SR SR, GF GU, 0 Datensätze (Das ergebnis des Vergleiches) Machen die Kommas was aus? Habe aber auch schon für V1 ein komma mit dazugeschrieben? beispiel: (@V1 = @V1 + ',') Ich weiß leider nicht mehr wo ich ansetzen soll. Kenn mich in der VBA Programmierung einigermaßen aus und habe auch schon mit Access gearbeitet. Mit T-SQL habe ich erst angefangen. Ich hoffe ihr könnt mir helfen. Danke im voraus net-tobi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Buell Geschrieben 12. März 2010 Teilen Geschrieben 12. März 2010 SET @ZAEHLER = @ZAEHLER +1 Isses das vielleicht? Gruß Buell Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
net-tobi Geschrieben 12. März 2010 Autor Teilen Geschrieben 12. März 2010 Hallo buell danke für den Hinweis aber ich habe hier das ä nur aus versehen geschrieben im Code ist es ohne ä Da steht es wie du geschrieben hast. Der Zähler funktioniert ja, nur der vergleich scheitert, im code wird der Zähler übersprungen. net-tobi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 23. März 2010 Teilen Geschrieben 23. März 2010 Hi net-tobi, mach dir keine Gedanken des If Befehls wegen. Ein relativ einfaches Select Statement reicht für deine Zwecke aus. Mit deinem Cursor und der If Abfrage bremst du deine Datenbank nur aus. Goos PS: Da du aus der VBA Programmierung kommst, denkst du halt vermutlich noch nicht mengenorientiert. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
net-tobi Geschrieben 26. März 2010 Autor Teilen Geschrieben 26. März 2010 Hallo Goos danke fü die Antwort leider brauche ich den Cursor um in dieser Tabelle jeden Datensatz durchsehen muß. Denn hier stehten zwei Sachen die ich dann über den Vergleich mit den Variablen prüfen muß ob diese gleich sind! Die Lösung des ganzen liegt ganz einfach darin, das die beiden Variabeln nicht gleich lang waren mit den Befehl len habe ich die länge der Variablen geprüft und festegestellt das die ein Variabel um ein Zeichen länger war. Das Komma so wie ich es schon beschrieben habe. Als die Lösung lautet hier Set @V1 = @V1 + ',' Warum das das erstemal wie ich es gemacht nicht funktioniert hat, weiß ich nicht. Danke für euere Hilfe net-tobi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 26. März 2010 Teilen Geschrieben 26. März 2010 Hi net-tobi, du brauchst dafür wirklich keinen Cursor und solltest den an der Stelle auch besser nicht verwenden, dabei bleib ich Wenn du mir mal kurz ein paar Spaltennamen und relevante Werte aus den 3 Tabellen postest, dann mach ich dir dazu auch mal ein passendes Statement. Vielleicht bringt dich das dann ja beim Thema SQL ein wenig weiter. Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
net-tobi Geschrieben 27. März 2010 Autor Teilen Geschrieben 27. März 2010 Hallo Goos danke für das Angebot. Ich tippe mal das du die Anweisung join in meinst hoffe ich habe es richtig geschrieben. Das ganze läuft nicht auf einer Produktivdatenbank darum nehme ich es mit der Performenc nicht so eng. Ich gebe dir da auch recht mit dem das ein Cursor nicht ganz das schnellste ist. Das ganze ist eine Testdatenbank. Die Laufzeit beträgt bei ca. 60 000 Datensätzen ca. 1,5 Stunden. Wenn du magst kannst du ja mal einfach ein paar beispiel nutzen das ziel wäre dann das mir der Zähler am ende ein Ergebnis ausgibt. Schönen Abend net-tobi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 29. März 2010 Teilen Geschrieben 29. März 2010 Hi net-tobi, letztendlich ists deine Sache, wie du das machen willst. 1,5 Stunden halte ich allerdings für heftigst viel. Das sollte eher eine Sache von Sekunden sein bei 60000 Datensätzen. Wenn du hier allerdings keine Beispieltabellen posten willst, dann seh ich auch wenig Chancen dir ein entsprechendes Beispielstatement zu präsentieren. Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Toothrot Geschrieben 29. März 2010 Teilen Geschrieben 29. März 2010 Ich gebe dir da auch recht mit dem das ein Cursor nicht ganz das schnellste ist. Das ganze ist eine Testdatenbank. Die Laufzeit beträgt bei ca. 60 000 Datensätzen ca. 1,5 Stunden. :eek "Nicht ganz das Schnellste," sagt er. Wenn du magst kannst du ja mal einfach ein paar beispiel nutzen das ziel wäre dann das mir der Zähler am ende ein Ergebnis ausgibt. Äh... was? Für ein Select-Statement bräuchten wir die Tabellenstruktur und was Du genau haben möchtest. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
net-tobi Geschrieben 1. April 2010 Autor Teilen Geschrieben 1. April 2010 Hallo zusammen sorry da ich mich ne Zeit nicht gemeldt habe, war ein bischen eingespannt. Zu den 1,5h sollte man noch wissen das das ganze (wie gesagt eine TestDB) auf eine Intel Atom N270 mit 1,6 GHz und 2 GB Ram in einer VM läuft die 1 GB zur Verfügung hat. Hätte ich woll noch dazuschreiben müssen. Nun zur Bitte wegen der Tabellenstruktur, musste nochmal die grauen Zellen anstengen wie das ganze zusammen gehört. Hoffe bringe es verständlich rüber. Ihr habt mich da echt neugierig gemacht. Als Erbenis soll rauskommen wieviel Datensätze in der TabRA die Wert Objekt und UC gleich sind. So nun geht es los: T1 (Tabelle1) TabRA ist die Tabelle die die beiden Werte enthält die verglichen werden sollen, diese könne aber nicht so in der Rohform verglichen werden, also TabRA enthält Wert Objekt und Wert UC T2 (Tabelle2) TabUC enthält die erste Vergleichsvariabele V1 Wert KO diese wird über den Wert UC gesucht aus der TabRA T3 (Tabelle3) TabObjekt hier wird über den Wert Objekt aus der TabRA der Wert Art gesucht. (Achtung dieser ändert sich in der nächsten Tabelle T4 !!!) T4 (Tabelle4) TabObG hier wird die zweite Vergleichsvariabel V2 gesucht über den Wert IDGR (ist in der T3 der Wert Art) Sorry sind sogar 4 Tabellen nicht wie Anfangs geschrieben 3! So ich hoffe es ist verständlich das umänderen der Wert in T3 und T4 dafür kann ich nichts ist so vorgeben. Ich bin nun auf die Select anweisung gespannt wie ein flitzebogen. Wünsche euch noch schöne Ostern net-tobi Bei Fragen einfach melden ich hoffe ich kann die unklarheiten beseitigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 6. April 2010 Teilen Geschrieben 6. April 2010 Moin net-tobi, ich werd mal versuchen die von die genannten Tabellen und Parameter zu verwenden. So wie du es beschreibst müssen also der wert KO aus Tabelle 2 und ein Wert V2 aus Tabelle 4 für den entsprechenden Datensatz übereinstimmen um gezählt zu werden. Vom Prinzip her musst du nur all deine Tabellen joinen, auf übereinstimmende Vergleichswerte prüfen und das dann zählen. Es könnte also in etwa folgendermassen ausschaun: SELECT COUNT(TabUC.KO) --zählen FROM TabRA INNER JOIN TabUC ON TabRA.UC = TabUC.UC INNER JOIN TabObjekt ON TabRA.Objekt = TabObjekt.Objekt INNER JOIN TabObG ON TabObjekt.Art = TabObG.IDGR WHERE TabUC.KO = TabObG.V2 --vergleichen Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
net-tobi Geschrieben 7. April 2010 Autor Teilen Geschrieben 7. April 2010 Hallo Goos danke für den Code hab ihn zwar noch nicht ausprobiert aber sieht intressant aus. Mit Inner Join hatte ich also nicht ganz unrecht, dachte gar nicht das der Befehl so mächtig ist. Aber nochmal doof gefragt erzeugt dies Funktion nun eine Virtuelle Tabelle oder fügt er diese das ganze zu einer Realen Tabelle zusammen? Danke im voraus net-tobi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Goos Geschrieben 7. April 2010 Teilen Geschrieben 7. April 2010 Hi net-tobi, nach Ausführung des Statements bleibt nichts "reales" übrig, wenn man mal vom Execution Plan im Cache absieht. Du kannst es dir sogesehen gerne als virtuelle Tabelle vorstellen. Goos Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.