Announcement

Collapse
No announcement yet.

SQL-Skript abbrechen

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

  • SQL-Skript abbrechen

    Hallo,
    ich möchte, dass mein Skript nur ausgeführt wird, wenn die Datenbank eine bestimmte Version hat (die in einer Tabelle gepflegt wird). Ansonsten soll der Anwender eine Fehlermeldung bekommen und das Skript soll abgebrochen werden.
    Ich hatte es mit der GoTo-Anweisung versucht, aber da im Skript mehrere GO's und COMMIT's vorhanden sind, funktioniert das leider nicht wirklich.
    Kennt da vielleicht jemand eine Lösung für?

    [highlight=sql-server]
    if ((select DB_Version from TM_Versioninfo) <> '2.2')
    Begin
    Print 'Für diese Datenbankversion ist das Skript nicht zulässig!'
    GoTo Beenden
    end

    /** Skriptanfang **/
    BEGIN TRANSACTION
    SET QUOTED_IDENTIFIER ON
    SET ARITHABORT ON
    SET NUMERIC_ROUNDABORT OFF
    SET CONCAT_NULL_YIELDS_NULL ON
    SET ANSI_NULLS ON
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    COMMIT
    BEGIN TRANSACTION
    GO
    select * from TM_Versioninfo
    COMMIT
    /** Skriptende **/

    Beenden:
    [/highlight]

  • #2
    Hallo Andreas,

    pack das Script doch einfach in den ELSE Zweig:

    [highlight=SQL]
    if ((select DB_Version from TM_Versioninfo) <> '2.2')
    Begin
    Print 'Für diese Datenbankversion ist das Skript nicht zulässig!'
    GoTo Beenden
    end
    ELSE
    BEGIN
    /** Skriptanfang **/
    BEGIN TRANSACTION
    -- usw
    END[/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      also manchmal könnt ich mich echt....
      Danke Olaf, das hat geholfen.

      Comment


      • #4
        Jetzt schimpft die Codeprüfung bei jedem GO
        Wenn ich die GO's entferne funktionieren aber die ALTER TABLE nicht mehr...irgendwas ist an der Ecke noch faul

        Comment


        • #5
          Die ganzen SET Anweisung mit abschließendem GO kannst Du an den Anfang des Scriptes ausserhalb der IF ELSE Anweisung setzen.
          Innerhalb eines BEGIN END Blocks darfst Du kein GO verwenden, das es das Batch-Ende darstellt; brauchst Du in dem Fall dann aber auch nicht mehr (ist ja nur für die SETs).
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #6
            Das versteh ich jetzt ehrlich gesagt nicht, aber vielleicht kannst du es mir an einem größeren Auschnitt meines Scriptes verdeutlichen.

            [highlight=sql-server]
            if ((select DB_Version from TM_Versioninfo) <> '2.2')

            Begin
            Print 'Für diese Datenbankversion ist das Skript nicht zulässig!'
            END

            ELSE

            Begin

            /* TM_Mitarbeiter*/

            Print 'TM_Mitarbeiter'

            BEGIN TRANSACTION
            SET QUOTED_IDENTIFIER ON
            SET ARITHABORT ON
            SET NUMERIC_ROUNDABORT OFF
            SET CONCAT_NULL_YIELDS_NULL ON
            SET ANSI_NULLS ON
            SET ANSI_PADDING ON
            SET ANSI_WARNINGS ON
            COMMIT
            BEGIN TRANSACTION
            GO
            ALTER TABLE dbo.TM_Mitarbeiter ADD
            Sprache varchar(5) NOT NULL CONSTRAINT DF_TM_Mitarbeiter_Sprache DEFAULT 'DE'
            GO
            COMMIT

            /* TP_Abteilung*/

            Print 'TP_Abteilung'
            BEGIN TRANSACTION
            SET QUOTED_IDENTIFIER ON
            SET ARITHABORT ON
            SET NUMERIC_ROUNDABORT OFF
            SET CONCAT_NULL_YIELDS_NULL ON
            SET ANSI_NULLS ON
            SET ANSI_PADDING ON
            SET ANSI_WARNINGS ON
            COMMIT
            BEGIN TRANSACTION
            GO
            ALTER TABLE dbo.TP_Abteilung
            DROP CONSTRAINT DF_TP_Abteilung_Filter
            GO
            CREATE TABLE dbo.Tmp_TP_Abteilung
            (
            AbteilungKurz varchar(3) NOT NULL,
            Sprachkenner varchar(5) NOT NULL,
            Bezeichnung varchar(30) NULL,
            PID varchar(20) NULL,
            Filter bit NOT NULL,
            Sortierung varchar(10) NULL
            ) ON [PRIMARY]
            GO
            ALTER TABLE dbo.Tmp_TP_Abteilung ADD CONSTRAINT
            DF_TP_Abteilung_Sprachkenner DEFAULT 'DE' FOR Sprachkenner
            GO
            ALTER TABLE dbo.Tmp_TP_Abteilung ADD CONSTRAINT
            DF_TP_Abteilung_Filter DEFAULT (0) FOR Filter
            GO
            IF EXISTS(SELECT * FROM dbo.TP_Abteilung)
            EXEC('INSERT INTO dbo.Tmp_TP_Abteilung (AbteilungKurz, Bezeichnung, PID, Filter, Sortierung)
            SELECT AbteilungKurz, Bezeichnung, PID, Filter, Sortierung FROM dbo.TP_Abteilung WITH (HOLDLOCK TABLOCKX)')
            GO
            Commit
            DROP TABLE dbo.TP_Abteilung
            GO
            EXECUTE sp_rename N'dbo.Tmp_TP_Abteilung', N'TP_Abteilung', 'OBJECT'
            GO
            ALTER TABLE dbo.TP_Abteilung ADD CONSTRAINT
            PK_TP_Abteilung_1 PRIMARY KEY CLUSTERED
            (
            AbteilungKurz,
            Sprachkenner
            ) ON [PRIMARY]

            GO
            COMMIT


            /* TP_AkquiStand*/

            Print 'TP_AkquiStand'
            BEGIN TRANSACTION
            SET QUOTED_IDENTIFIER ON
            SET ARITHABORT ON
            SET NUMERIC_ROUNDABORT OFF
            SET CONCAT_NULL_YIELDS_NULL ON
            SET ANSI_NULLS ON
            SET ANSI_PADDING ON
            SET ANSI_WARNINGS ON
            COMMIT
            BEGIN TRANSACTION
            GO
            CREATE TABLE dbo.Tmp_TP_AkquiStand
            (
            AkquiseStandID int NOT NULL,
            Sprachkenner varchar(5) NOT NULL,
            AkquiseStandText varchar(25) NULL,
            Sortierung varchar(10) NULL
            ) ON [PRIMARY]
            GO
            ALTER TABLE dbo.Tmp_TP_AkquiStand ADD CONSTRAINT
            DF_TP_AkquiStand_Sprachkenner DEFAULT 'DE' FOR Sprachkenner
            GO
            IF EXISTS(SELECT * FROM dbo.TP_AkquiStand)
            EXEC('INSERT INTO dbo.Tmp_TP_AkquiStand (AkquiseStandID, AkquiseStandText, Sortierung)
            SELECT AkquiseStandID, AkquiseStandText, Sortierung FROM dbo.TP_AkquiStand WITH (HOLDLOCK TABLOCKX)')
            GO
            DROP TABLE dbo.TP_AkquiStand
            GO
            EXECUTE sp_rename N'dbo.Tmp_TP_AkquiStand', N'TP_AkquiStand', 'OBJECT'
            GO
            ALTER TABLE dbo.TP_AkquiStand ADD CONSTRAINT
            PK_TP_AkquiStand PRIMARY KEY CLUSTERED
            (
            AkquiseStandID,
            Sprachkenner
            ) ON [PRIMARY]

            GO
            COMMIT
            END
            [/highlight]

            Das ist nur ein kleiner Teil des Scripts. Insgesamt sind dort 731 GO's drin. (hab ich eben beim löschen gesehn )

            Comment


            • #7
              Also, die SET Anweisungen beziehen sich auf die Session, da reicht es, wenn die einmal angegeben werden; macht das Script gleich etwas übersichtlicher.

              Ein GO ist ein Batch-Ende. Alles was bis zum GO kommt, wird wie ein Script behandelt, alles was danach kommt als ein weiteres. Was vorher war, wird "vergessen", wie Variable-Deklarationen oder auch BEGIN Anweisungen; ein folgendes END ist dann ein Fehler.
              Also, alle GO aus den BEGIN END Blöcken raus.

              Hinweis: Es gibt ein paar DDL Befehle, die müssen zwingend am Anfang eines Batches stehen, ich meine das waren CREATE Trigger,bin mir aber nicht ganz sicher.
              Die könntest Du so also nicht anwenden.

              Hier das Script, ein paar Sachen habe ich auskommentiert, weil es bei mir die Tabellen nicht gibt. Der Rest läuft dann fehlerfrei durch (abgesehen ein ein paar zuvielen COMMITs)

              [highlight=SQL]-- Session Setting
              SET QUOTED_IDENTIFIER ON
              SET ARITHABORT ON
              SET NUMERIC_ROUNDABORT OFF
              SET CONCAT_NULL_YIELDS_NULL ON
              SET ANSI_NULLS ON
              SET ANSI_PADDING ON
              SET ANSI_WARNINGS ON
              GO

              if 1= 2 --((select DB_Version from TM_Versioninfo) <> '2.2')
              BEGIN
              Print 'Für diese Datenbankversion ist das Skript nicht zulässig!'
              END
              ELSE

              BEGIN

              /* TM_Mitarbeiter */
              Print 'TM_Mitarbeiter'

              /* BEGIN TRANSACTION
              ALTER TABLE dbo.TM_Mitarbeiter ADD
              Sprache varchar(5) NOT NULL CONSTRAINT DF_TM_Mitarbeiter_Sprache DEFAULT 'DE'
              COMMIT

              /* TP_Abteilung*/

              Print 'TP_Abteilung'
              BEGIN TRANSACTION
              ALTER TABLE dbo.TP_Abteilung
              DROP CONSTRAINT DF_TP_Abteilung_Filter*/

              CREATE TABLE dbo.Tmp_TP_Abteilung
              (
              AbteilungKurz varchar(3) NOT NULL,
              Sprachkenner varchar(5) NOT NULL,
              Bezeichnung varchar(30) NULL,
              PID varchar(20) NULL,
              Filter bit NOT NULL,
              Sortierung varchar(10) NULL
              ) ON [PRIMARY]

              ALTER TABLE dbo.Tmp_TP_Abteilung ADD CONSTRAINT
              DF_TP_Abteilung_Sprachkenner DEFAULT 'DE' FOR Sprachkenner

              ALTER TABLE dbo.Tmp_TP_Abteilung ADD CONSTRAINT
              DF_TP_Abteilung_Filter DEFAULT (0) FOR Filter

              /* IF EXISTS(SELECT * FROM dbo.TP_Abteilung)
              EXEC('INSERT INTO dbo.Tmp_TP_Abteilung (AbteilungKurz, Bezeichnung, PID, Filter, Sortierung)
              SELECT AbteilungKurz, Bezeichnung, PID, Filter, Sortierung FROM dbo.TP_Abteilung WITH (HOLDLOCK TABLOCKX)')

              Commit
              DROP TABLE dbo.TP_Abteilung
              */
              EXECUTE sp_rename N'dbo.Tmp_TP_Abteilung', N'TP_Abteilung', 'OBJECT'

              ALTER TABLE dbo.TP_Abteilung ADD CONSTRAINT
              PK_TP_Abteilung_1 PRIMARY KEY CLUSTERED
              (
              AbteilungKurz,
              Sprachkenner
              ) ON [PRIMARY]


              --COMMIT

              /* TP_AkquiStand*/
              Print 'TP_AkquiStand'

              CREATE TABLE dbo.Tmp_TP_AkquiStand
              (
              AkquiseStandID int NOT NULL,
              Sprachkenner varchar(5) NOT NULL,
              AkquiseStandText varchar(25) NULL,
              Sortierung varchar(10) NULL
              ) ON [PRIMARY]

              ALTER TABLE dbo.Tmp_TP_AkquiStand ADD CONSTRAINT
              DF_TP_AkquiStand_Sprachkenner DEFAULT 'DE' FOR Sprachkenner

              /* IF EXISTS(SELECT * FROM dbo.TP_AkquiStand)
              EXEC('INSERT INTO dbo.Tmp_TP_AkquiStand (AkquiseStandID, AkquiseStandText, Sortierung)
              SELECT AkquiseStandID, AkquiseStandText, Sortierung FROM dbo.TP_AkquiStand WITH (HOLDLOCK TABLOCKX)')

              DROP TABLE dbo.TP_AkquiStand
              */
              EXECUTE sp_rename N'dbo.Tmp_TP_AkquiStand', N'TP_AkquiStand', 'OBJECT'

              ALTER TABLE dbo.TP_AkquiStand ADD CONSTRAINT
              PK_TP_AkquiStand PRIMARY KEY CLUSTERED
              (
              AkquiseStandID,
              Sprachkenner
              ) ON [PRIMARY]


              --COMMIT

              END
              [/highlight]
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #8
                ah, ok, jetzt hab ichs kapiert
                Danke

                Comment


                • #9
                  Originally posted by O. Helper View Post
                  Hinweis: Es gibt ein paar DDL Befehle, die müssen zwingend am Anfang eines Batches stehen, ich meine das waren CREATE Trigger,bin mir aber nicht ganz sicher.
                  Das betrifft so ziemlich alle außer Create Table...

                  [Highlight="SQL"]BEGIN TRAN;
                  CREATE VIEW Test AS SELECT GETDATE() AS D;
                  ROLLBACK[/Highlight]

                  Originally posted by O. Helper View Post
                  Die könntest Du so also nicht anwenden.
                  das muss man dann so machen:
                  [Highlight="SQL"]BEGIN TRAN;
                  IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[Test]'))
                  EXEC dbo.sp_executesql @statement = N'CREATE VIEW [dbo].[Test] AS SELECT GETDATE() AS D;'

                  SELECT * FROM sys.objects WHERE name = N'test';
                  ROLLBACK -- und weg damit
                  SELECT * FROM sys.objects WHERE name = N'test'; [/HIGHLIGHT]

                  Comment


                  • #10
                    es gab genau einen Trigger im Script, den habe ich jetzt herausgenommen.
                    Hab alle GO entfernt und darauf geachtet, das DECLARE immer nur einmal auf den selben Variablen-Namen gemacht wird.

                    Jetzt ist die Syntaxprüfung immer Fehlerfrei, wenn ich jedoch das Script ausführen lasse, bekomm ich folgende Meldung:

                    Meldung 207, Ebene 16, Status 1, Zeile 0
                    Ungültiger Spaltenname 'Text'.
                    Ich habe daraufhin alle Spalten, die Text heißen in [Text] umbenannt.
                    Die Meldung kommt dennoch weiterhin.

                    Comment


                    • #11
                      Die Fehlermeldung bekommt man eigentlich, wenn es das Feld in der Tabelle nicht gibt; das schon geprüft?
                      Olaf Helper

                      <Blog> <Xing>
                      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                      Comment


                      • #12
                        kann es sein, das dadurch, das es keine GO mehr gibt, irgendwo die Spalte Text abgefragt wird von einer Tabelle die in der selben Transaction erstellt wird und er sie deshalb nicht findet? Mit GO's und ohne IF funktioniert das Script nämlich.

                        Comment


                        • #13
                          Ach, ich wusste doch, das ich mindestens eine Sache vergessen habe.

                          Unter MS SQL 2000 funktioniert das wegen der Transaction mit dem ALTER nicht so, wie man es sich wünscht; das neue Feld ist sozusagen erst nach dem GO verfügbar.
                          Wenn man die Transaktion weg lässt, geht es auch unter 2000.

                          Unter MS SQL Server >= 2005 funktioniert es so oder so tadellos.

                          [highlight=SQL]--BEGIN TRAN
                          CREATE TABLE tmp (id int);
                          ALTER TABLE tmp
                          ADD Test varchar(2);

                          SELECT Test FROM tmp
                          --COMMIT

                          GO
                          SELECT Test FROM tmp

                          DROP TABLE tmp[/highlight]
                          Olaf Helper

                          <Blog> <Xing>
                          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                          Comment


                          • #14
                            hmm...auf meinem 2005er bekomm ich aber die selbe Fehlermeldung. Kann es sein das es erst ab 2008 funktioniert?

                            Wird denn das Transaction und das Comit überhaupt benötigt? Oder ist das in dem Kontext eh blödsinn?
                            Irgendwo hab ich gelesen das bestimmte Aktionen eh nicht zurückgerollt werden können.
                            Zuletzt editiert von Andreas Mahr; 29.04.2009, 15:44.

                            Comment


                            • #15
                              ich hab mal alle Transaction entfernt, die Fehlermeldung bleibt die selbe

                              Comment

                              Working...
                              X