Announcement

Collapse
No announcement yet.

SQL Abfrage aus einer SQL Tabelle erstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Abfrage aus einer SQL Tabelle erstellen

    Hallo,

    für ein kleines SQL-Projekt habe ich eine gute Tabellendokumentation im Excel erstellen:

    Tabellennamen1 (1. Spalte), Spaltennamen1 (2. Spalte), Primärschlüssel 0 / 1 (3. Spalte), Datentyp (4. Spalte), Länge / Precision (5. Spalte), Informationen (6(Spalte)
    Dann folgen die weiteren Spaltennamen der Tabellen, schließlich eine neue Tabelle mit weiteren Spaltennamen und so weiter.

    Ich habe vor, dieses Exceldokument in den SQL-Server als Tabelle einzuspielen. Das geht auf jeden Fall. Ist es aber auch möglich, aus dieser Tabelle eine CREATE-Abfrage zu erstellen?

    Mit ein wenig Aufwand möchte ich ganz gerne, dass mir alle Tabellen automatisch angelegt werden.

    Das ist sicherlich möglich - aber wie?

    Viele Grüße

  • #2
    Für mich fehlt da noch die Angabe, wie das ablaufen sollte. Also sollten die Tabellen über Excel erstellt werden oder schreibst du ein Programm in Vb oder mit C# oder willst du ein Script im ManagementStudio aufrufen, muss das vor dem Benutzer versteckt werden, sollte ein Anwenderprogramm bei Programmstart das checken und bei Bedarf selber tätig werden, wie sieht es mit der Sicherheit (zB. Login) aus, ...?

    Und hast du dir auch das überlegt:
    - was soll mit eventuell bestehenden Tabellen passieren?
    - wie wird die Datenbank dafür definiert und besteht die dann immer schon?
    - gibt es Fremdschlüsselbeziehungen, Trigger, Sichten, calculatedColumns die auf UDF's basieren?

    Du hast da jetzt mal nur die grundlegensten Elemente im Excel-Sheet aber du solltest daran denken, dass das mal komplexer werden könnte.

    Ein Weg wäre, sich als Admin in der master-datenbank anzumelden, zu checken was zu tun ist und das dann per dynamischem SQL anzulegen.

    bye,
    Helmut

    Comment


    • #3
      Hallo,

      vielen Dank für deine Antwort.

      Ich stelle mir das so vor: Ich lade die Exceltabelle in den Microsoft Server SQL 2008. Nun habe ich eine Tabelle mit sechs Spalten.

      Jetzt möchte ich mit einem einfachen Skript erreichen, dass mir ein Create-Code generiert wird.

      Beispiel:



      Mit einem einfachen Skript soll folgendes Create-Skript (Syntax nicht korrekt - habe gerade kein SQL hier) generiert werden:

      CREATE TABLE Lehrer
      {
      LehrerID int NOT NULL is PrimaryKey,
      VName nvarchar(20) NULL,
      NName nvarchar(20) NULL
      }


      Wenn die Tabellen alle vorhanden sind, wird das Skript für dieses Projekt nicht mehr benötigt. Bezüglich Sicherheit, vorhandene Tabellen, Trigger etc. muss ich mir keine Sorgen machen.

      Ich will nur nicht händisch alle Tabellen anlegen, das ist alles ;-)

      Wenn möglich, kann ich auch sehr gerne ein Create-Skript von meiner Exceltabelle generieren - wenn das irgendwie geht.

      Ich bin (noch!) zu sehr ein Laie und weiß noch nicht, wie ich das anstellen soll.

      Viele Grüße

      Comment


      • #4
        Erst in die Exceltabelle, dann von dort in die DB als Tabelle, dann daraus ein SQL erzeugen, dass die eigentliche Tabelle anlegt, dann sind die eben erzeugten Tabellen obsolet?

        Das ist doch enorm umständlich.

        Warum nicht die Daten in eine TXT-Datei legen und daraus die Tabellen anlegen lassen. Mit einer beliebigen Sprache....
        Christian

        Comment


        • #5
          Gibt es trotzdem eine Lösung für jemanden, der technisch an einer solchen Lösung interessiert ist?

          PS: Die Tabellen werde ich natürlich nutzen, nachdem ich sie erstellt habe.

          Comment


          • #6
            Sicherlich wird es ein Lösung geben, um das aus Tabellen zu erzeugen.

            Dazu stellen sich folgende Fragen:

            Woran erkennt man eine neue Tabelle? Am Wechsel des Namen in S1?
            Woraus ergibt sich der PrimaryKey? Immer der int? Immer der erste Wert? Aus S3?
            Woraus ergibt sich "not Null"? Aus S3?
            Warum die Länge in Klammer angegeben?

            Letztlich ist eine solche Lösung aufwändiger, als die Tabellen per Hand oder Programm anzulegen
            Christian

            Comment


            • #7
              Die neue Tabelle soll das System am Wechsel des Namens in S1 erkennen.
              Die Primärschlüssel erkennt man aus S1 - 1 bedeutet ja, "nichts" bedeutet nein.
              Alle Werten sollen NOT NULL bekommen - bis auf die Primärschlüssel.
              Wenn möglich, kann ich auch die Länge nicht in Klammern angeben. Das sollte egal sein.

              Comment


              • #8
                Wenn du deine Vorgabentabelle um die Spalte 'ID' erweitern würdest und diese mit einer fortlaufenden Nummer befüllst und diese Tabelle dann zB mit Name 'vorgabe' in der Zieldatenbank steht und du dort mit dem ManagementStudio angemeldet bist, könnte das ansatzweise etwa so aussehen (braucht man nur in eine "neue Abfrage" reinkopieren und starten):

                Code:
                declare @s varchar(900), @tbl varchar(99)
                declare @id int
                
                set @tbl = ''
                while 1 = 1 begin
                  select @tbl = min(s1) from vorgabe where s1 > @tbl
                  select @id = 0, @s = 'create table ' + @tbl + ' ('
                  while 1 = 1 begin
                    select @id = min(id) from vorgabe where s1 = @tbl and id > @id
                    select @s = @s + s2 + ' ' + s4 + s5 + ' NULL, ' from vorgabe
                      where id = @id 
                    if @id = (select max(id) from vorgabe where s1 = @tbl) begin
                      set @s = substring(@s, 1, len(@s) - 1) + ')'
                      exec (@s)    -- für Tests hier statt dem "exec(@s)" ein "select @s" schreiben 
                      break
                    end
                  end
                  if @tbl = (select max(s1) from vorgabe) break
                end
                bye,
                Helmut

                PS: ist jetzt nur mal als Ansatz gedacht, aber dn Ausbau mit dem PrimaryKey usw. lasse ich dem Fragesteller als Aufgabe :-)
                Zuletzt editiert von hwoess; 02.10.2011, 10:08. Reason: Hinweis, wie man testen kann

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  Woran erkennt man eine neue Tabelle? Am Wechsel des Namen in S1?
                  Wozu, kann man im Cursor dann sortieren

                  Originally posted by Christian Marquardt View Post
                  Woraus ergibt sich der PrimaryKey? Immer der int? Immer der erste Wert? Aus S3?
                  sollte man schon spezifizieren
                  z.B.
                  , constraint_name SYSNAME -- PK_Tabelle
                  , constraint_type SYSNAME -- PRIMARY KEY
                  , constraint_value SYSNAME

                  letztere ist für CHECK-, DEFAULT- und FOREIGN KEY-Constraints interessanter

                  Originally posted by Christian Marquardt View Post
                  Woraus ergibt sich "not Null"? Aus S3?
                  Warum nicht...
                  Originally posted by Christian Marquardt View Post
                  Warum die Länge in Klammer angegeben?
                  keine extra Spalte, gehört zum Datentyp

                  Originally posted by Christian Marquardt View Post
                  Letztlich ist eine solche Lösung aufwändiger, als die Tabellen per Hand oder Programm anzulegen
                  Nicht unbedingt..., man hat eine Schnittstelle, die sich das Anlegen und Verwalten der Tabellen erledigt...
                  mit entsprechender Kommentar Spalte sogar eine kleine Doku

                  Also, entsprechende Tabelle anlegen...

                  Instead Of-Trigger auf diese Tabelle anlegen, der doppelte Datensätze erst gar nicht in die Tabelle einfügt, da Schema-, Tabellen- und Spaltenname eindeutig sind...

                  [HIGHLIGHT="SQL"]CREATE TRIGGER dbo.tables_Instead_Of_Insert
                  ON dbo.Tables INSTEAD OF INSERT AS
                  BEGIN;
                  INSERT INTO dbo.Tables
                  ( schema_name
                  , Table_name
                  , column_name
                  , column_type
                  , Nullable
                  )
                  SELECT I.schema_Name
                  , I.table_name
                  , I.column_name
                  , I.column_type
                  , I.nullable
                  FROM INSERTED AS I
                  JOIN (
                  SELECT schema_Name
                  , table_name
                  , column_name
                  , column_type
                  , nullable
                  FROM INSERTED
                  EXCEPT
                  SELECT schema_Name
                  , table_name
                  , column_name
                  , column_type
                  , nullable
                  FROM dbo.Tables
                  ) AS X ON X.schema_Name = I.schema_Name
                  AND X.table_name = I.table_name
                  AND X.column_name = I.Column_Name
                  OR ( SELECT COUNT(*) FROM dbo.Tables ) = 0
                  ;
                  END;[/HIGHLIGHT]

                  Die Logik, die Helmut als Beispiel (müsste wohl noch ein bißchen angepasst werden), gegeben hat, könnte man in einen After Insert-Trigger implementieren, so das nach jedem Einfügen in die Tabelle (hier dbo.Tables) die entsprechenden Tabellen angepasst werden...

                  Comment

                  Working...
                  X