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)
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
@Brett: Vedo il tuo punto ora. Torna al tavolo da disegno. –
@Brett: ho modificato la mia risposta. Non sono sicuro se questo è meglio di quello che hai già provato. –