none
Stored con 2 risultati RRS feed

  • Domanda

  • Chiedo aiuto a voi perche siete i migliori:

    Ho questa Stored  che mi seleziona dei dati da una serie di tabelle:

    USE [Ar10D]
    GO
    /****** Object:  StoredProcedure [dbo].[Summ3]    Script Date: 10/10/2019 15:56:59 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[Summ3] 
    	@L123 int
    AS
    
    BEGIN
    	SET NOCOUNT ON;
    
    -- ****** Inizio ************************************
    
    WITH 
    SuY3a AS 
    (SELECT * FROM dbo.Ana WHERE AnId > 140100389),
    
    SuY3b AS
    (SELECT * FROM SuY3a WHERE AnId < 140100395)
    
    SELECT * FROM SuY3a
    
    -- ****** Fine ************************************
    
    END


    Come potete notare c'è un paranetro inutilizzato (@L123), io vorrei che se 

    assume il valore 1 allora il set di risultati sia  SELECT * FROM SuY3a  (cosi come è adesso)
    mentre se assume il valore 2 il set di risultati sia  SELECT * FROM SuY3b  (questo non riesco a farlo)

                    Grazie a chi potra aiutarmi




    • Modificato Mancini, giovedì 10 ottobre 2019 14:28
    giovedì 10 ottobre 2019 14:25

Risposte

  • Ciao,

    purtroppo non puoi referenziare una common table expression (CTE) all'interno di un IF. Questo è il motivo dell'errore sulla tua istruzione

    Una soluzione alternativa potrebbe essere utilizzare degli oggetti temporanei per salvare i risultati delle tue query e poi, sempre con una istruzione IF oppure CASE, scegliere quale dataset visualizzare.

    Se i select sono complessi prova ad incorporarli all'interno di viste se non hanno bisogno di parametri...


    HTH,

    Cristiano Gasparotto, MCSE Data Management and Analytics

    You can find me working hard every day at Datamaze!

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    • Contrassegnato come risposta Mancini, venerdì 11 ottobre 2019 15:39
    venerdì 11 ottobre 2019 06:53

Tutte le risposte

  • Ciao,

    puoi scrivere nel corpo della tua stored procedure questo:

    IF @L123 = 1
    BEGIN
    	WITH 
    	SuY3a AS 
    	(SELECT * FROM dbo.Ana WHERE AnId > 140100389)
    	
    	SELECT * FROM SuY3a
    END
      
    IF @L123 = 2
    BEGIN
    	WITH 
    	SuY3a AS 
    	(SELECT * FROM dbo.Ana WHERE AnId > 140100389),
    	SuY3b AS
    	(SELECT * FROM SuY3a WHERE AnId < 140100395)
    
    	SELECT * FROM SuY3b
    END

    Non molto elegante ma efficace!


    HTH,

    Cristiano Gasparotto, MCSE Data Management and Analytics

    You can find me working hard every day at Datamaze!

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    giovedì 10 ottobre 2019 14:42
  • ...... Non molto elegante ma efficace! ......

    Grazie per la risposta ..... :) .....

    Si,   certamente efficace,  ma vorrei evitare questa soluzione perche nella relata quelle SELECT  (SiY3a e SuY3b) che io ho "stilizzato" con 2 righe sono in effetti molto piu corpose e coinvolgono molte tabelle ......

    Io preferivo una soluzione che mi permettesse di scriverle solamente 1 volta Tipo:

    WITH 
    SuY3a AS 
    (SELECT * FROM dbo.Ana WHERE AnId > 140100389),
    
    SuY3b AS
    (SELECT * FROM SuY3a WHERE AnId < 140100395)
    
    IF @L123 = 1     -- qui mi segnala un errore sulla IF
    	BEGIN
    		SELECT * FROM SuY3a
    	END
    
    IF @L123 = 2
    	BEGIN
    		SELECT * FROM SuY3b
    	END

    In cui non dovrei riscrivere (copincollare) le SELECT

    Chiaramente se non si puo fare diversamente mi accontentero ... :) .....

     
    giovedì 10 ottobre 2019 20:48
  • Ciao,

    purtroppo non puoi referenziare una common table expression (CTE) all'interno di un IF. Questo è il motivo dell'errore sulla tua istruzione

    Una soluzione alternativa potrebbe essere utilizzare degli oggetti temporanei per salvare i risultati delle tue query e poi, sempre con una istruzione IF oppure CASE, scegliere quale dataset visualizzare.

    Se i select sono complessi prova ad incorporarli all'interno di viste se non hanno bisogno di parametri...


    HTH,

    Cristiano Gasparotto, MCSE Data Management and Analytics

    You can find me working hard every day at Datamaze!

    Please Mark This As Answer if it solved your issue or Vote This As Helpful if it helps to solve your issue. Thank you!

    • Contrassegnato come risposta Mancini, venerdì 11 ottobre 2019 15:39
    venerdì 11 ottobre 2019 06:53
  • Ok,   

    Grazie  al posto delle CTE faro delle classiche Viste senza parametri limitando la Stored solo all' inserimento dei parametri finali

    Mancini

    venerdì 11 ottobre 2019 15:42
  • ...

    Io preferivo una soluzione che mi permettesse di scriverle solamente 1 volta Tipo:

    WITH 
    SuY3a AS 
    (SELECT * FROM dbo.Ana WHERE AnId > 140100389),
    
    SuY3b AS
    (SELECT * FROM SuY3a WHERE AnId < 140100395)
    
    IF @L123 = 1     -- qui mi segnala un errore sulla IF
    	BEGIN
    		SELECT * FROM SuY3a
    	END
    
    IF @L123 = 2
    	BEGIN
    		SELECT * FROM SuY3b
    	END

     

    Le due CTE insistono sulla stessa tabella dbo.Ana. Ne consegue che per risolvere il tuo quesito si può ricorrere ad una UNION.

    WITH 
    SuY3a AS 
    (SELECT * FROM dbo.Ana WHERE AnId > 140100389),
    
    SuY3b AS
    (SELECT * FROM SuY3a WHERE AnId < 140100395)
    
    SELECT * FROM SuY3a WHERE @L123 = 1
    UNION ALL
    SELECT * FROM SuY3b @L123 = 2
    

    sabato 12 ottobre 2019 14:48