Announcement

Collapse
No announcement yet.

SQL-Server und create procedure über ADO-Komponente

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

  • SQL-Server und create procedure über ADO-Komponente

    SQl-Server Express 2005, Delphi 5
    Mit "select * from sysobjects where type = 'P' and Name = 'SR_spSETANZAHL' " bekomme ich über mein Delphiprogramm raus ob bestimmte Datenbankänderungen schon da sind oder nicht. Bei Interbase habe ich dann mit einer Scriptkomponente das "Create procedure" automatisch zusammengebastelt und per executescript die Änderung in der Datenbank erzeugt. Mit ADOCommand und SQL-Server Express 2005 bekomme ich das aber nicht gebacken.
    Command1.CommandText := 'set ANSI_NULLS ON' + #13#10 +
    'set QUOTED_IDENTIFIER ON' + #13#10 +
    'GO' + #13#10 +
    'create procedure [dbo].[SR_spSETANZAHL]' + #13#10 +
    '@ID_BELEGP int' + #13#10 +
    .... uns so weiter
    Command1.execute bringt dann immer "Falscher syntax in der Nähe von GO". Gibt es überhaupt eine Möglichkeit über eine Delphikomponente ein "create procedure" umzusetzen?
    Über die SQL-Query im Management Studio funktioniert natürlich alles bestens, aber bei den ständigen Änderungen und vielen Testdatenbanken brauche ich ein Tool welches, ohne dass ich daran denken muss, die Datenbank auf notwendige Änderungen prüft.
    Gruß Andreas

  • #2
    Es funktioniert, wenn "SET ANSI_NULLS ON" usw. im Procedurebody angesiedelt wird. Da diese Option sowieso nur in der jeweiligen Procedure / Trigger gebraucht wird denke ich, dass das OK ist. Die Schreibweise mit vor dem "create" hatte ich aus einer vorhandenen procedure "gelernt" (ich arbeite erst seit zwei Monaten mit SQL-Server). Das "SET QUOTED_IDENTIFIER ON" ist sicher sowieso nur dann notwendig, wenn innnerhalb der Procedure mit Spalten / Tabellen mit Leerzeichen im Namen gearbeitet wird.
    Gruß Andrea

    Comment


    • #3
      Hallo!

      Vielleicht als Tipp die beiden Vorgänge "Gibts das schon" und "Neu anlegen" lassen sich sehr bequem zusammenfassen als

      if not exists(select * from mytable)
      insert into mytable values ( 1,2,3)

      das wird als Sql Statement vom MSSQl Server akzeptiert und das insert (kann natürlich auch ein Create sein) wird nur ausgeführt, wenn die IF Bedingung erfüllt ist.

      Das Änderungsmanagement von Datenbanken (wir haben da auch etliche (inkl. aller Kunden)) haben wir wie folgt gelöst:
      Eine Tabelle Version anlegen eine Spalte Version Typ integer. In dieser Tabelle eine einzelne Zeile anlegen. Der Wert gibt die Versionsnummer der Datenbankstruktur als Integer an.

      Wir haben eine Mastertabelle auf unserem Hauptserver, in der alle Änderungen abgelegt werden (in obiger Form IF etc..)
      Die Mastertablle hat eine fortlaufende Nummer, die dann die Versionsnummer darstellt.

      Wenn ich jetzt die Testdanbank A aufrufe und dort die Version 101 eingetragen ist aber die Mastertabelle schon bis 114 geht müssen die Updates 102-114 noch eingespielt werden.
      So kann ich alle Datenbanken schön auf einem Level halten ohne viel "Denkarbeit"

      Wenn Du im Enterprise Manager Tabellenstrukturen änderst kann Dir der Manager Änderungsskripte generieren. Damit kann man jetzt bequem die Mastertabelle auffüllen.

      Sorry den Source kann ich nicht mitgeben, da das alles auf unserer eigenen Multi Tier Architektur aufsetzt...

      BYE BERN

      Comment


      • #4
        Das Änderungsmanagement erledige ich mit Interbase so, dass ich mir per select den Procedurebody aus der Datenbank hole, dann mit dem aktuellen Stand vergleiche und wenn eine Änderung gefunden wird ein "alter Procedure" durchführe (oder bei nicht vorhanden ein create). Das ganze ist im Hauptprogramm mit drin, so dass jede Programmversion ihren notwendigen Datenbankzustand kennt, bei Programmstart prüft und wenn notwendig ändert.
        Wenn ich beim SQL-Server noch die Tabellen finde mit den Informationen: welche Tabelle hat welche Spalten mit welchen Datentyp / wie lautet der procedure oder Triggertext, dann werde ich das wieder auf diesem Wege erledigen. Hat sich schon ein paar Jahre bewährt.
        Gruß Andrea

        Comment


        • #5
          Habe Tabellen gefunden
          SELECT * FROM INFORMATION_SCHEMA.columns --(für die Felder in den Tabellen)
          SELECT * FROM information_schema.routines (für Proceduren und Funktionen)
          Gruß Andrea

          Comment

          Working...
          X