none
Clausola where condizionata da parametro passato RRS feed

  • Domanda

  • Mettiamola in modo selmplice

    ho un paramentro passato @param

    e un campo della query

    @param varchar(x)

    field int

    le condizioni sono

    se @param = null   allora (field is null or field > 0)

    se @param not null  allora (field > 0)

    come inserisco in una clausola where queste condizioni?

    martedì 27 luglio 2010 07:38

Risposte

Tutte le risposte

  • Ciao

    Riusciresti a spiegare meglio il risultato che vorresti ottenere ?

    Luca


    Luca Ferrari [Url]http://tipsandtrickssqlserver.blogspot.com/[Url]
    martedì 27 luglio 2010 09:33
  • Ok Luca

    il risultato che vorrei ottenere è questo

    supponiamo di avere 2 tabelle Tb1 e TempTb

    TempTb viene riempita  dinamicamente con gli indici passati dal parametro( se viene  passato pieno)

    create table insert ecc

    se il parametro contiene dei valori

    select tb1.id, tb1.blabla, ... from tb1

    inner join TempTb on Tb1.Id = TempTb.Id

    il risultato di questa select

     

    se il parametro è null

    select tb1.id, tb1.blabla, ... from tb1

    Left outer join TempTb on Tb1.Id = TempTb.Id

    il risultato di questa select

     

    In realta le tabelle in gioco sono molte di piu di 2

    Ovviamente vorrei ottenere lo stesso risultato scrivendone una sola di procedure

    se non ti dispiace potresti vedere il mio post precedente

    Ciao GianPiero

     

    martedì 27 luglio 2010 10:40
  • Spero di aver interpretato bene quello che intendevi

    Se utilizzi SQL Server 2008 potresti usare le table_value parameters, che consentono alle SP di ricevere come input dei dati di tipo tabella

    Use tempDb

    Go
    Create table Tb1
    (
        id int identity(1,1),
        id_dominio int,
        Valore VarChar(10)
    )

    Create table TempTb
    (
        id int identity(1,1),
        dominio VarChar(10)
    )

    insert into Tb1 (id_dominio,Valore)
        values (1,'Valore1'),
        (1,'Valore2'),
        (2,'Valore3'),
        (3,'Valore4'),
        (4,'Valore5'),
        (5,'Valore6'),
        (6,'Valore7'),
        (7,'Valore8')
    GO

    Insert into TempTb
    values('D1'),
        ('D2'),
        ('D3'),
        ('D4'),
        ('D5')
    GO

    --Serve per specificare il tipo dato passato in input alla SP
    create type dbo.TempTb as table
    (
        id int identity(1,1),
        dominio char(2)
    )
    GO

    Create procedure dbo.RecuperaValori
        @TabIndici as TempTb readonly
    as

    if exists(Select * from @TabIndici)
    begin
        insert into temptb Select dominio from @TabIndici
        Select * from Tb1
            inner join temptb as Ind on Tb1.id_dominio = Ind.id
    end
    else
        Select * from Tb1
            left join TempTb as Ind on Tb1.id_dominio = Ind.id
    Go

     

    --Chiamo quindi la sp

    exec dbo.RecuperaValori    --è come se passassi null come paremetro, la tabella è vuota infatti


    Declare @TempTb as TempTb
    Insert into @TempTb
    values('D6'),
        ('D7'),
        ('D8'),
        ('D9')
    exec dbo.RecuperaValori @TempTb --parametro not null


    Drop table Tb1
    Drop table TempTb
    Drop procedure dbo.RecuperaValori
    drop type TempTb

     

    Se utilizzi SQL 2005 de non puoi utilizzare i Table Value Params ma potresti far si che la sprecuperi i parametri da una tabella temporanea

     

    Use tempDb
    Go
    Create table Tb1
    (
        id int identity(1,1),
        id_dominio int,
        Valore VarChar(10)
    )

    Create table TempTb
    (
        id int identity(1,1),
        dominio VarChar(10)
    )

    insert into Tb1 (id_dominio,Valore)
        values (1,'Valore1')
    insert into Tb1 (id_dominio,Valore)
        values (1,'Valore2')
    insert into Tb1 (id_dominio,Valore)
        values (2,'Valore3')
    insert into Tb1 (id_dominio,Valore)
        values (3,'Valore4')
    insert into Tb1 (id_dominio,Valore)
        values (4,'Valore5')
    insert into Tb1 (id_dominio,Valore)
        values (5,'Valore6')
    insert into Tb1 (id_dominio,Valore)
        values (6,'Valore7')
    insert into Tb1 (id_dominio,Valore)
        values (7,'Valore8')
    GO

    Insert into TempTb
    values('D1')
    Insert into TempTb
    values('D2')
    Insert into TempTb
    values('D3')
    Insert into TempTb
    values('D4')
    Insert into TempTb
    values('D5')
    GO

    create table dbo.#TempTb
    (
        id int identity(1,1),
        dominio char(2)
    )
    GO

    Create procedure dbo.RecuperaValori
    as

    if exists(Select * from #TempTb)
    begin
        insert into temptb Select dominio from #TempTb
        Select * from Tb1
            inner join temptb as Ind on Tb1.id_dominio = Ind.id
    end
    else
        Select * from Tb1
            left join TempTb as Ind on Tb1.id_dominio = Ind.id
    Go

    exec dbo.RecuperaValori



    Insert into #TempTb
    values('D6')
    Insert into #TempTb
    values('D7')
    Insert into #TempTb
    values('D8')
    Insert into #TempTb
    values('D9')
       
    exec dbo.RecuperaValori


    Drop table Tb1
    Drop table TempTb
    Drop table #TempTb
    Drop procedure dbo.RecuperaValori

    spero d'aver capito cosa intendevi...

    Ciao

    Luca

     


    Luca Ferrari [Url]http://tipsandtrickssqlserver.blogspot.com/[Url]
    martedì 27 luglio 2010 13:09
  • Ciao Luca

    Ti ringrazio ma credo che cosi possa funzionare con un solo join

    Facciamo cosi che è + semplice

    io ho questa select

     

    Select

     

    Users.Surname,

     

    Users.Name,

     

    Stora.DataEvent,

     

    EventsDesc.Description,

     

    IdeMitt.IdeMittDesc,

     

    Term.TermDesc,

     

    KeyCode.Code,

     

    Stora.Args,

     

    Stora.Args2,

     

    Stora.Args3,

     

    Users.credit,

     

    Users.Exportval,

     

    Stora.EventNum,

     

    Stora.IdUser,

     

    Term.IdTerm,

     

    IdeMitt.IdIdeMitt,

     

    Stora.IdEvent,

     

    Users.IdProfile As UsersIdProfile,

     

    Users.IdSite As UsersIdSite

     

    From Stora

     

    Left Join EventsDesc On Stora.EventNum = EventsDesc.IdEvent

     

    Left Join KeyCode On Stora.IdCode = KeyCode.IdKeyCode

     

    Left Join IdeMitt On Stora.IdIdeMitt = IdeMitt.IdIdeMitt

     

    Left Join Term On Stora.IdTerm = Term.IdTerm

     

    Left Join Users On Stora.IdUser = Users.IdUser

     

    Where

     

    Stora.DataEvent Between @STARTDATE And @ENDDATE

     

    And

     

    EventsDesc.IdLang = @IDLANG

    e questi sono i parametri che devo passare alla procedura

     

    @IDOPERATOR BIGINT,

     

    @STARTDATE DATETIME,

     

    @ENDDATE DATETIME,

     

    @IDLANG INT = 2,

     

    @MYIDIDEMITTS VARCHAR(2000) = NULL,

     

    @MYIDUSERS VARCHAR(2000) = NULL,

     

    @MYIDTERMS VARCHAR(2000) = NULL,

     

    @MYIDEVENTS VARCHAR(2000) = NULL

    Come puoi notare in questo modo dovrei ricevere tutti i record di stora

    i parametri @MYIDIDEMITTS @MYIDUSERS @MYIDTERMS @MYIDEVENTS

    se passati sono riempiti con gli indici di ogni tabella lincata tipo 1,2,3

    come posso fare per filtrare il risultato in base al fatto che possa o non passare questi parametri

    i parametri dovrebbero poter essere passati 1 o piu o nessuno

    come si potrebbe fare

    Ciao GianPiero

    mercoledì 28 luglio 2010 09:14
  • se passati sono riempiti con gli indici di ogni tabella lincata tipo 1,2,3

    come posso fare per filtrare il risultato in base al fatto che possa o non passare questi parametri

    i parametri dovrebbero poter essere passati 1 o piu o nessuno


    Ciao GianPiero,

    In questo thread troverai una soluzione di Itzik basata sull'uso oculato del Dynamic SQL oppure l'elegante soluzione di Marcello basata su una UDF inline.

    Ciao!


    Lorenzo Benaglia
    Microsoft MVP - SQL Server
    http://blogs.dotnethell.it/lorenzo
    http://social.microsoft.com/Forums/it-IT/sqlserverit
    mercoledì 28 luglio 2010 10:19
    Moderatore