Frage zu MS-SQL

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Frage zu MS-SQL

    Ich habe eine Tabelle X mit 4 Spalten P, FOO1, FOO2, A, B, C

    Die Spalte P ist ein künstlicher Primary-Key, A, B und C sind varchar, not null und nicht unique. FOO1 und FOO2 enthalten sonstige Daten.

    Wie kann ich bei MS-SQL eine identity-Spalte über die Spalten A, B und C einfügen?

    Zur Erläuterung: ich möchte eine Spalte D vom Typ integer, mit Auto-Increment und zwar immer dann, wenn select * from table where A=$a and B=$b and C=$c keine Treffer liefert.

    Ich habe gelesen, dass dies mit einem Table-Constraint erledigt werden könnte. Leider war bei dem Beispiel kein SQL-Code für den Constraint dabei

    Meine zweite Idee war eine zusätzliche Tabelle Y mit einem compound primary key Y.P über die Spalten X.A, X.B und X.C der Tabelle X und einer Y.A mit auto-increment, aber ich blicke leider nicht durch, wie ich es anstellen muss mit der Referenzierung der Spalten, sowie dass in Tabelle Y automatisch ein neuer Datensatz angelegt wird, wenn auf Tabelle X ein Insert ausgeführt wird. Da fehlt mir das notwendige Wissen, wie die SQL-Syntax aussehen muss.

    Die Microsoft-Hilfe ist leider nicht sonderlich hilfreich und bei Google habe ich nichts brauchbares gefunden. Würde mich wahnsinnig freuen, wenn mir jemand auf die Sprünge helfen könnte!

    Danke im Voraus...

  • #2
    Re: Frage zu MS-SQL

    Original geschrieben von Marcusson
    Ich habe eine Tabelle X mit 4 Spalten P, FOO1, FOO2, A, B, C
    wo hast du Mathe gelernt

    Wie kann ich bei MS-SQL eine identity-Spalte über die Spalten A, B und C einfügen?

    Zur Erläuterung: ich möchte eine Spalte D vom Typ integer, mit Auto-Increment und zwar immer dann, wenn select * from table where A=$a and B=$b and C=$c keine Treffer liefert.
    überlege nochmals was du da sagst, denn mit der Bedingung kannst du keine Identity-Spalte haben, da mehrfach NULL vorkommen kann, und zwar genau dann wenn die Bedingung nicht zutrifft!

    Kommentar


    • #3
      Re: Re: Frage zu MS-SQL

      Original geschrieben von asp2php
      wo hast du Mathe gelernt
      Sorry - es sind hier 6. Interessant davon sind jedoch nur 4 Spalten Die "FOO"-Spalten sollen lediglich andeuten, dass es noch eine unbestimmte Anzahl sonstiger Spalten geben kann.

      Original geschrieben von asp2php überlege nochmals was du da sagst, denn mit der Bedingung kannst du keine Identity-Spalte haben, da mehrfach NULL vorkommen kann, und zwar genau dann wenn die Bedingung nicht zutrifft![/B]
      Das ist nicht korrekt. Wohl gemerkt: "identity" meint hier das proprietäre Schlüsselwort "identity", wie zum Beispiel bei "identity(1,1)". Das ist eine Syntax um das MySQL-typische "Auto-Increment" Feature für MS-SQL zu simulieren.

      Es soll lediglich das Auto-Increment an diese Bedingung geknüpft werden. Wenn du Bedingung erfüllt ist, soll um 1 erhöht werden, anonsten soll der Wert mit dem aktuellen Zählerstand eingefügt werden. Das bedeutet NULL-Werte können nicht vorkommen, wohl aber doppelte Werte.
      Zuletzt geändert von Marcusson; 24.07.2006, 13:12.

      Kommentar


      • #4
        Re: Re: Re: Frage zu MS-SQL

        Original geschrieben von Marcusson
        Liest nochmal genau. Es kann sehr wohl eine identity-Spalte geben - es soll doch lediglich das Auto-Increment an diese Bedingung geknüpft werden.

        Wohl gemerkt: "identity" meint hier das proprietäre Schlüsselwort "identity", wie zum Beispiel bei "identity(1,1)".
        dann erkläre deine Bedingung für den Inhalt der Spalte D:

        Zur Erläuterung: ich möchte eine Spalte D vom Typ integer, mit Auto-Increment und zwar immer dann, wenn select * from table where A=$a and B=$b and C=$c keine Treffer liefert.
        was heisst das?

        A: was soll in D stehen wenn select * from table where A=$a and B=$b and C=$c keine Treffer liefert
        B: was soll in D stehen wenn select * from table where A=$a and B=$b and C=$c Treffer liefert

        für mich bedeutet:

        A: soll Autoincrementwert
        B: nichts, also NULL, oder irgendeinen anderen festen Wert, was die Bedeutung von Identity wiederum zerstört => Konflikt

        Außerdem, was soll denn ein Identity mit einer Bedingung? Wenn man eine Spalte in der Tabelle mit Identity definiert, dann wird eben mit jedem Datensatz einen Wert automatisch erzeugt, die Bedingung für den erzeugten Wert kann man nur über identity(startwert, incrementwert) definieren.

        Das was du brauchst, musst du manuell erstellen. MS-SQL-Server kann dir sowas nicht anbieten. Schreibe eine Userfunktion und verknüpfe sie mit einem Trigger und zwar for update und for insert
        Zuletzt geändert von asp2php; 24.07.2006, 13:25.

        Kommentar


        • #5
          Schlauberger Wenn ich ein begnadeter Freak in Transact-SQL wäre, der wüsste wie man Trigger und Stored Procedures für den MS SQL Server implementiert, dann würde ich doch nicht solche Anfängerfragen stellen, oder?

          Ich verstehe die allgemeine Theorie, aber von dem ganzen proprietären Microsoft-Zeugs habe ich keine Ahnung - und ich will auch gar kein MS-SQL Guru werden, sondern wirklich NUR dieses spezielle Problem lösen.

          dann erkläre deine Bedingung für den Inhalt der Spalte D:
          als Pseudocode:
          Code:
          declare sequence as integer = 0
          on insert
          BEGIN
              IF #condition# = true THEN
                  SET sequence = sequence + 1
              END
              SET table.d = sequence
          END
          Falls das mit Triggern und Stored-Procedures irgendwie zu machen geht, dann wäre ein Code-Beispiel sehr hilfreich.

          Hintergrund ist ganz einfach: bis jetzt muss das umständlich über ein externes Programm erledigt werden. Das hat natürlich eine Reihe von Nachteilen. Deutlich besser wäre es, wenn die Datenbank in der Lage wäre die Konsistenz selbst zu sichern.

          Kommentar


          • #6
            dann schaue doch in die OH des MS-SQL Servers, so schwer ist es nun mal auch nicht, e.g.
            Code:
             
            CREATE TRIGGER MyTrigger
               ON MyTable
                  FOR INSERT, UPDATE
                      AS
                         -- Variablen deklarieren
                         declare @varA  ...
                          -- Werte auslesen und in Variablen ablegen
                          SELECT @varA=A, @varB=B ... FROM ... WHERE...
                          -- Auswerten
                          IF ....
                              BEGIN
                                   ....
                              END
                          ELSE
                              BEGIN
                              .....
                              END

            Kommentar


            • #7
              Danke ich werde den Code mal ausprobieren.

              Die MS-OH ist leider alles andere als hilfreich, denn man findet nur dann etwas, wenn man genau weiß wonach man sucht. Nach Konzepten zu fanden ist nahezu aussichtslos.

              Kommentar

              Lädt...
              X