Announcement

Collapse
No announcement yet.

stored procedure + if alternative

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

  • stored procedure + if alternative

    möchte eine SP schreiben in der fall abhängig where klauseln verwendet werden...
    das habe ich bis jetzt:

    Code:
    go
    CREATE PROCEDURE SelectSeiteninhaltdi  (
    @SNR int,
    @Oberbereich nvarchar(max),
    @Unterbereich nvarchar(max),
    @Ebene int,
    @Sprache nvarchar(5) = 'de'
    )
    
    AS
    BEGIN
    
    SELECT S_Nr,
    		S_Ebene,
    	    S_Oberbereich,
    	    S_Unterbereich,
    	    S_Obertitel,
    	    S_AnleserTitel,
    	    S_Anleser,
    		S_Inhalte,
    	   (SELECT COUNT(S_NR)
    		  FROM SEITE next
    		 WHERE next.S_Oberbereich = this.S_Oberbereich
    		   AND next.S_Unterbereich = this.S_Unterbereich
    		   AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
        FROM SEITE this 
     INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
    INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr 
    
    IF (@Ebene = 1 OR @Ebene = 2)
    	BEGIN
    		WHERE S_Oberbereich LIKE @Oberbereich
    		  AND S_Ebene LIKE @Ebene+1
    		IF (@Ebene = 2)
    			BEGIN
    				AND S_Unterbereich LIKE @Unterbereich
    			END
    END 
    ELSE 
    	BEGIN
    		WHERE S_Nr = @SNR
    	END
    AND WS_WERT LIKE @Sprache
    
    END
    GO
    als fehlermeldung beim ausführen bekomme ich dies:
    Meldung 156, Ebene 15, Status 1, Prozedur SelectSeiteninhaltdi, Zeile 31
    Falsche Syntax in der Nähe des 'WHERE'-Schlüsselwortes.
    Meldung 156, Ebene 15, Status 1, Prozedur SelectSeiteninhaltdi, Zeile 35
    Falsche Syntax in der Nähe des 'AND'-Schlüsselwortes.



    hoffe mir kann wer helfen danke im vorraus
    was haben Windows und ein Uboot gemeinsam?
    - wenn man ein Fenster öffnet fangen die Probleme an

  • #2
    Hi Dawit,
    Du musst in diesem Fall das SQL-Statement als nvarchar "zusammenbauen" und anschließend mit der EXECUTE - Funktion ausführen.

    HTH,
    Karsten

    Comment


    • #3
      Hallo,

      Am Besten baust du dir vorher einen String zusammen und fuehrst diesen dann mit EXEC aus.

      Beispiel:
      DECLARE @Command VARCHAR(5000)
      SET @Command = "SELECT ...."
      IF (@Ebene = 1 OR @Ebene = 2)
      BEGIN
      SET @Command = @Command + "WHERE S_Oberbereich LIKE @Oberbereich ..."
      END
      SET @Command = @Command + "..."
      EXEC (@Command)
      *-- robert.oh. --*

      Comment


      • #4
        Originally posted by robert.oh. View Post
        Hallo,

        Am Besten baust du dir vorher einen String zusammen und fuehrst diesen dann mit EXEC aus.

        Beispiel:
        DECLARE @Command VARCHAR(5000)
        SET @Command = "SELECT ...."
        IF (@Ebene = 1 OR @Ebene = 2)
        BEGIN
        SET @Command = @Command + "WHERE S_Oberbereich LIKE @Oberbereich ..."
        END
        SET @Command = @Command + "..."
        EXEC (@Command)
        ok das hat mir weitergeholen habe es jetzt so gemacht:
        Code:
        go
        CREATE PROCEDURE SelectSeiteninhaltdi  (
        @SNR int,
        @Oberbereich nvarchar(max),
        @Unterbereich nvarchar(max),
        @Ebene int,
        @Sprache nvarchar(5) = 'de'
        )
        
        AS
        BEGIN
        
        DECLARE @Abfrage VARCHAR(5000)
        SET @Abfrage = 'SELECT S_Nr,
        				S_Ebene,
        				S_Oberbereich,
        				S_Unterbereich,
        				S_Obertitel,
        				S_AnleserTitel,
        				S_Anleser,
        				S_Inhalte,
        			   (SELECT COUNT(S_NR)
        				  FROM SEITE next
        				 WHERE next.S_Oberbereich = this.S_Oberbereich
        				   AND next.S_Unterbereich = this.S_Unterbereich
        				   AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
        			FROM SEITE this 
        		 INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
        		INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr
        '
        IF (@Ebene = 1 OR @Ebene = 2)
        BEGIN
        SET @Abfrage = @Abfrage + 'WHERE S_Oberbereich LIKE @Oberbereich AND S_Ebene LIKE @Ebene+1'
        	IF (@Ebene = 2)
        			BEGIN
        				SET @Abfrage = @Abfrage +'AND S_Unterbereich LIKE @Unterbereich'
        			END
        END
        ELSE 
        		SET @Abfrage = @Abfrage +'WHERE S_Nr = @SNR'
        
        SET @Abfrage = @Abfrage + ' AND WS_WERT LIKE @Sprache'
        EXEC (@Abfrage)
        
        END
        GO
        bekomme jetzt aber beim testen im MS SQL Mangement studio die fehlermeldung :
        Meldung 137, Ebene 15, Status 2, Zeile 17
        Die "@Oberbereich"-Skalarvariable muss deklariert werden.


        muss ich jetzt für jeden parameter declare machen in der procedure ?!
        was haben Windows und ein Uboot gemeinsam?
        - wenn man ein Fenster öffnet fangen die Probleme an

        Comment


        • #5
          Ich hab diese Meldung auch schon mal bekommen, bin mir aber nicht mehr ganz sicher, wie ich sie 'entfernt' habe.

          Ist zwar nicht ganz schoen, aber probier bitte folgendes:
          - die Klammern nach EXEC weglassen (= EXEC @Abfrage)
          oder
          - die Parameter (@Oberbereich, ...) in den String 'integrieren' also zB '... WHERE S_Oberbereich LIKE ' + @Oberbereich + ' AND ...'

          HTH
          *-- robert.oh. --*

          Comment


          • #6
            Originally posted by robert.oh. View Post
            Ich hab diese Meldung auch schon mal bekommen, bin mir aber nicht mehr ganz sicher, wie ich sie 'entfernt' habe.

            Ist zwar nicht ganz schoen, aber probier bitte folgendes:
            - die Klammern nach EXEC weglassen (= EXEC @Abfrage)
            oder
            - die Parameter (@Oberbereich, ...) in den String 'integrieren' also zB '... WHERE S_Oberbereich LIKE ' + @Oberbereich + ' AND ...'

            HTH
            hab ich mal versucht:

            Code:
            go
            CREATE PROCEDURE SelectSeiteninhaltdi  (
            @SNR int,
            @Oberbereich nvarchar(max),
            @Unterbereich nvarchar(max),
            @Ebene int,
            @Sprache nvarchar(5) = 'de'
            )
            
            AS
            BEGIN
            
            DECLARE @Abfrage VARCHAR(5000)
            SET @Abfrage = 'SELECT S_Nr,
            				S_Ebene,
            				S_Oberbereich,
            				S_Unterbereich,
            				S_Obertitel,
            				S_AnleserTitel,
            				S_Anleser,
            				S_Inhalte,
            			   (SELECT COUNT(S_NR)
            				  FROM SEITE next
            				 WHERE next.S_Oberbereich = this.S_Oberbereich
            				   AND next.S_Unterbereich = this.S_Unterbereich
            				   AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
            			FROM SEITE this 
            		 INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
            		INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr
            '
            IF (@Ebene = 1 OR @Ebene = 2)
            BEGIN
            SET @Abfrage = @Abfrage + 'WHERE S_Oberbereich LIKE ' + @Oberbereich + ' AND S_Ebene =' + @Ebene +'+1'
            	IF (@Ebene = 2)
            			BEGIN
            				SET @Abfrage = @Abfrage +'AND S_Unterbereich LIKE ' + @Unterbereich
            			END
            END
            ELSE 
            		SET @Abfrage = @Abfrage +'WHERE S_Nr = ' + @SNR
            
            SET @Abfrage = @Abfrage + ' AND WS_WERT LIKE ' + @Sprache
            EXEC @Abfrage
            
            END
            GO
            jetzt bekomm ich das:
            Meldung 245, Ebene 16, Status 1, Prozedur SelectSeiteninhaltdi, Zeile 32
            Fehler beim Konvertieren des nvarchar-Wertes 'SELECT S_Nr,
            S_Ebene,
            S_Oberbereich,
            S_Unterbereich,
            S_Obertitel,
            S_AnleserTitel,
            S_Anleser,
            S_Inhalte,
            (SELECT COUNT(S_NR)
            FROM SEITE next
            WHERE next.S_Oberbereich = this.S_Oberbereich
            AND next.S_Unterbereich = this.S_Unterbereich
            AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
            FROM SEITE this
            INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
            INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr
            WHERE S_Oberbereich LIKE Business Intelligence AND S_Ebene =' in den int-Datentyp.


            das " Business Intelligence" stand in @Oberbereich das hat er also geschluckt und richtig verarbeitet
            die ebene ganz am ende nicht
            hab auch gecheckt s_ebene in der seitentabelle ist def int .....
            was haben Windows und ein Uboot gemeinsam?
            - wenn man ein Fenster öffnet fangen die Probleme an

            Comment


            • #7
              Numerische Datentypen muesstest du in diesem Fall in einen String casten.

              Beispiel:
              '... S_Ebene = ' + CAST(@SNr AS VARCHAR(10))

              (je nachdem wie gross / lang deine Zahl ist)
              *-- robert.oh. --*

              Comment


              • #8
                Originally posted by robert.oh. View Post
                Numerische Datentypen muesstest du in diesem Fall in einen String casten.

                Beispiel:
                '... S_Ebene = ' + CAST(@SNr AS VARCHAR(10))

                (je nachdem wie gross / lang deine Zahl ist)
                ach verdammt stimmt versuche ja ne int in den string einzubinden wie dooof sorry bin ich ein depp
                was haben Windows und ein Uboot gemeinsam?
                - wenn man ein Fenster öffnet fangen die Probleme an

                Comment


                • #9
                  Kein Problem, das kennt glaub ich jeder
                  *-- robert.oh. --*

                  Comment


                  • #10
                    BOAH ICH DREH AM RAD
                    es tut mir leid ich komm mir gerade vor als wenn ich noch nie an einem computer gesessen hätte Oo

                    Code:
                    go
                    CREATE PROCEDURE SelectSeiteninhaltdi  (
                    @SNR int,
                    @Oberbereich nvarchar(max),
                    @Unterbereich nvarchar(max),
                    @Ebene int,
                    @Sprache nvarchar(5) = 'de'
                    )
                    
                    AS
                    BEGIN
                    
                    DECLARE @Abfrage VARCHAR(8000)
                    SET @Abfrage = 'SELECT S_Nr,
                    				S_Ebene,
                    				S_Oberbereich,
                    				S_Unterbereich,
                    				S_Obertitel,
                    				S_AnleserTitel,
                    				S_Anleser,
                    				S_Inhalte,
                    			   (SELECT COUNT(S_NR)
                    				  FROM SEITE next
                    				 WHERE next.S_Oberbereich = this.S_Oberbereich
                    				   AND next.S_Unterbereich = this.S_Unterbereich
                    				   AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
                    			FROM SEITE this 
                    		 INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
                    		INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr
                    '
                    IF (@Ebene = 1 OR @Ebene = 2)
                    BEGIN
                    SET @Abfrage = @Abfrage + 'WHERE S_Oberbereich LIKE ' + @Oberbereich + ' AND S_Ebene =' + CAST(@Ebene AS nvarchar(5)) +'+1'
                    	IF (@Ebene = 2)
                    			BEGIN
                    				SET @Abfrage = @Abfrage +'AND S_Unterbereich LIKE ' + @Unterbereich
                    			END
                    END
                    ELSE 
                    		SET @Abfrage = @Abfrage +'WHERE S_Nr = ' + @SNR
                    
                    SET @Abfrage = @Abfrage + ' AND WS_WERT LIKE ' + @Sprache
                    EXEC @Abfrage
                    
                    END
                    GO
                    und dann bekomme ich das raus:

                    Meldung 2812, Ebene 16, Status 62, Prozedur SelectSeiteninhaltdi, Zeile 42
                    Die gespeicherte Prozedur '' wurde nicht gefunden.


                    (1 Zeile(n) betroffen) -> steht auch da


                    und wenn ich
                    Code:
                    exec SelectSeiteninhaltdi(NULL,'Business Intelligence',NULL,1,'de')
                    kommt:
                    Meldung 156, Ebene 15, Status 1, Zeile 1
                    Falsche Syntax in der Nähe des 'NULL'-Schlüsselwortes.


                    habs auch so versucht das gleich ergebnis:
                    Code:
                    exec SelectSeiteninhaltdi('NULL','Business Intelligence','NULL',1,'de')
                    OMG
                    Zuletzt editiert von Dawit; 08.08.2007, 19:01.
                    was haben Windows und ein Uboot gemeinsam?
                    - wenn man ein Fenster öffnet fangen die Probleme an

                    Comment


                    • #11
                      sorry ich mach jetzt nen neuen eintrag und editier nicht, da das problem oben soweit erledigt ist

                      laut msdn muss exec ohne runde klammern um die parameter ausgeführt werden
                      Code:
                      exec SelectSeiteninhaltdi NULL,'Business Intelligence',NULL,1,'de'
                      schön und gut und dann folgt das:

                      Meldung 203, Ebene 16, Status 2, Prozedur SelectSeiteninhaltdi, Zeile 42
                      Der Name 'SELECT S_Nr,
                      S_Ebene,
                      S_Oberbereich,
                      S_Unterbereich,
                      S_Obertitel,
                      S_AnleserTitel,
                      S_Anleser,
                      S_Inhalte,
                      (SELECT COUNT(S_NR)
                      FROM SEITE next
                      WHERE next.S_Oberbereich = this.S_Oberbereich
                      AND next.S_Unterbereich = this.S_Unterbereich
                      AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
                      FROM SEITE this
                      INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
                      INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr
                      WHERE S_Oberbereich LIKE Business Intelligence AND S_Ebene =1+1 AND WS_WERT LIKE de' ist kein gültiger Bezeichner.



                      muss ich jetzt noch @Abfrage casten damit der das ausführen kann ???
                      oder was

                      ich glaub ich kündige und werde dosenstapler bei aldi ....
                      was haben Windows und ein Uboot gemeinsam?
                      - wenn man ein Fenster öffnet fangen die Probleme an

                      Comment


                      • #12
                        Hallo,

                        beim Aufruf von exec SelectSeiteninhaltdi fehlt der Klammeraffe vor dem Variablenname. Ohne diese Kennzeichnung sucht der SQL Server nach einem gleichnamigen Datenbankobjekt.

                        P.S:Wenn eine dynamische SQL-Anweisung ausgeführt werden soll, hat der Weg über sp_excecutesql gegenüber dem EXEC-Weg immer dann Vorteile, wenn Parameter im Spiel sind. Der Grund dafür liegt darin, dass sp_excecutesql ein Interface unterstützt und somit auf lokale Variablen der Stapelanweisung zugreifen kann:

                        Code:
                        SET NOCOUNT ON;
                        USE tempdb
                        GO
                        
                         
                        IF OBJECT_ID('TestTbl') IS NOT NULL
                          DROP TABLE TestTbl;
                        GO
                        
                        CREATE TABLE TestTbl
                        (
                          testtbl_id INT         NOT NULL IDENTITY PRIMARY KEY,
                          wert       NVARCHAR(9) NOT NULL
                        )
                        GO
                        INSERT INTO dbo.TestTbl (wert) VALUES ('Test 1');
                        INSERT INTO dbo.TestTbl (wert) VALUES ('Test 2');
                        INSERT INTO dbo.TestTbl (wert) VALUES ('Test 3');
                        GO
                        
                        -- Variante A: EXEC
                        
                        DECLARE @s AS VARCHAR(99);
                        DECLARE @i AS INT;
                        SET @i = 1;
                        SET @s = 'SELECT * FROM dbo.TestTbl WHERE testtbl_id = @i;';
                        -- EXEC hat kein Interface, daher gelten lokale Variablen dort nicht!
                        EXEC(@s);  
                        -- Ergebnis: Veto: Die "@i"-Skalarvariable muss deklariert werden.
                        
                         
                        -- Variante B: sp_executesql
                         
                        DECLARE @s AS NVARCHAR(99);
                        DECLARE @i AS INT;
                        SET @i = 1;
                        SET @s = 'SELECT * FROM dbo.TestTbl WHERE testtbl_id = @recid;';
                        -- sp_executesql hat ein Interface, so dass lokale Variablen nutzbar sind!
                        EXEC sp_executesql @stmt = @s, @params = N'@recid AS INT', @recid = @i;
                        -- Ergebnis: 1 Datensatz

                        Comment


                        • #13
                          ok der fall ist erledigt
                          haber vergessen das nach dem like anführungszeichen folgen müssen dadurch hat er gesagt ,dass die variable kein gültiger string ist....

                          naja nochmal anbei die funktionierende lösung

                          Code:
                          create PROCEDURE SelectSeiteninhaltdi  (
                          @SNR int,
                          @Oberbereich nvarchar(max),
                          @Unterbereich nvarchar(max),
                          @Ebene int,
                          @Sprache nvarchar(5) = 'de'
                          )
                          
                          AS
                          BEGIN
                          
                          DECLARE @Abfrage nvarchar(max)
                          SET @Abfrage = 'SELECT S_Nr,
                          				S_Ebene,
                          				S_Oberbereich,
                          				S_Unterbereich,
                          				S_Obertitel,
                          				S_AnleserTitel,
                          				S_Anleser,
                          				S_Inhalte,
                          			   (SELECT COUNT(S_NR)
                          				  FROM SEITE next
                          				 WHERE next.S_Oberbereich = this.S_Oberbereich
                          				   AND next.S_Unterbereich = this.S_Unterbereich
                          				   AND this.S_Ebene+1 = next.S_Ebene ) AS KinderAnzahl
                          			FROM SEITE this 
                          		 INNER JOIN W_SPRACHE ON W_SPRACHE.WS_NR = this.S_SPRACHE
                          		INNER JOIN W_SEITENTYP ON this.wst_nr = W_SEITENTYP.wst_nr'
                          
                          IF (@Ebene = 1 OR @Ebene = 2)
                          BEGIN
                          SET @Abfrage = @Abfrage + ' WHERE S_Oberbereich LIKE ''' + @Oberbereich + ''' AND S_Ebene =' + CAST(@Ebene AS nvarchar(5)) +'+1'
                          	IF (@Ebene = 2)
                          			BEGIN
                          				SET @Abfrage = @Abfrage +' AND S_Unterbereich LIKE ''' + @Unterbereich+''''
                          			END
                          END
                          ELSE 
                          		SET @Abfrage = @Abfrage +'WHERE S_Nr = ' + @SNR
                          
                          SET @Abfrage = @Abfrage + ' AND WS_WERT LIKE ''' + @Sprache+''''
                          EXEC (@Abfrage)
                          
                          END
                          aber danke für die hilfe besonders an robert.oh.
                          was haben Windows und ein Uboot gemeinsam?
                          - wenn man ein Fenster öffnet fangen die Probleme an

                          Comment

                          Working...
                          X