2010-09-22 14 views
9

Sto costruendo una query che ha una serie di parametri facoltativi, alcuni dei quali sono parametri con valori di tabella. Il problema che sto affrontando è come utilizzare in modo più efficiente i TVP in questa query?Istruzione condizionale Dove su un parametro con valori di tabella?

Ogni TVP ha il tipo:

TABLE([variable] nvarchar(30)) 

So che ho potuto in genere:

INNER JOIN @TVP 

per filtrare tutto ciò che non è nella lista TVP, ma cosa succede se Ho deciso di non trasmettere alcun valore al TVP nella mia domanda? Allora niente verrà restituita (a causa della inner join)

Di solito questo viene realizzato con un condizionale in cui dichiarazione:

WHERE (SomeVar = @SameVar OR @SameVar IS NULL) 

Ma, con una TVP, che non può essere nulla (almeno non che ho trovato)

Un modo che ho trovato per raggiungere questo obiettivo è:

OUTER APPLY 
(SELECT TOP(1) * from dbo.SomeTable tbl where tbl.SomeVar in 
(select * from @TVP) or not exists (select * from @TVP) 
AND tbl.SomeVar = SomeVar) 

Purtroppo questo metodo è orribilmente lenta

In alternativa, ho provato:

WHERE (tbl.SomeVar in (SELECT * FROM @TVP) or not exists (SELECT * from @TVP)) 

Questo è molto più veloce, ma mi sento ancora come potrebbe non essere l'ideale

Qualsiasi aiuto o pensieri sarebbe molto apprezzato! Fatemi sapere se posso chiarire nulla .... Grazie in anticipo

EDIT:

Così, mi è venuta in mente questo, e probabilmente usarlo a meno che qualcuno ha una soluzione migliore:

INNER JOIN @TVP tvp 
ON (tvp.SomeVar = tbl.SomeVar or tvp.SomeVar is null) 

risposta

12

hai provato:

DECLARE @UseTVP int 
    SET @UseTVP = (SELECT COUNT(*) FROM @TVP) 

    SELECT TOP 1 * 
     FROM dbo.SomeTable tbl 
      LEFT JOIN @TVP tvp 
       ON tbl.SomeVar = tvp.SomeVar 
     WHERE (tvp.SomeVar IS NOT NULL 
       OR @UseTVP = 0) 
+0

Allora, che cosa se io non sto usando la TVP nel corso di una ricerca? Allora sarà sempre nullo, e non otterrò risultati, giusto? Come posso rendere l'uso del TVP opzionale? – Brett

+0

@Brett: Vedo il tuo punto ora. Torna al tavolo da disegno. –

+0

@Brett: ho modificato la mia risposta. Non sono sicuro se questo è meglio di quello che hai già provato. –

Problemi correlati