Opgelost Filter resultaten traag

Dit topic is als opgelost gemarkeerd
Dan moet je geen view in SQL server gebruiken, maar een SQL procedure. Daar kan je parameters aan meegeven.
 
Ik snap je laatste vraag niet, wat bedoel je precies? Als je een veld niet gebruikt om te filteren, wordt daar niet op gefilterd. Zo simpel is dat. En wil je in Access filteren (wat prima kan)?
 
nee, men wil op SQL server filtreren
Zit je soms naast Robert, dat je namens hem antwoord geeft? 😊.
Ik krijg toch de indruk dat hij met sFilter echt in VBA een filter maakt, en dat op zijn formulier wil gebruiken. Op een gefilterde View, dat wel.
 
Het klopt dat ik niet in Access wil filteren als dit de snelste manier is.

Oké dan moet ik met de SQL procedure aan de gang of is er een andere manier om dit te doen zonder dat de gehele inhoud van de tabel verstuurd wordt.

Het hele doel is om het geheel sneller te maken niet complexer.
 
Ik denk dat een SQL procedure de snelste en meest eenvoudige manier is. Je maakt die in de SSMS en je kan daar zowel parameters IN als OUT aan meegeven.
 
Misschien een beetje offtopic maar een vraag of SQL procedure.

Code:
Alter Procedure dbo.spJMDQ
    @Jaar Int,
    @Maand Int,
    @Dag Int
as
begin
    --set nocount on;

    select *
    from dbo.JMDQ_View
    Where Jaar = @Jaar
        And Maand = @Maand
        And Dag = @Dag
    Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch;
end

Welke waarde moet ik ingeven tussen de '' om de procedure alle dagen in februari 2024 weer te geven?

Code:
exec dbo.spJMDQ '2024', '2', ''

* of niets ingeven laat geen resultaten zien, of moet dit op een andere manier opgelost worden?

Ik wil graag dat de procedure filtert ook op een deel van de filterdata dus b.v. alleen op Jaar of alleen op Maand
 
Laatst bewerkt:
Om te beginnen zijn je argumenten allemaal integers en geen varchars, dus moeten ze niet tussen aanhalingstekens.
Een mogelijkheid om alle dagen te kunnen weergeven:
Code:
Alter Procedure dbo.spJMDQ
    @Jaar Int,
    @Maand Int,
    @Dag Int
as
begin
    --set nocount on;
    if @Dag > 0
    begin
        select [geef hier de veldenlijst, gebruik geen * in een procedure]
        from dbo.JMDQ_View
        Where Jaar = @Jaar
            And Maand = @Maand
            And Dag = @Dag
            Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch;
     end
     else
     begin
         select [geef hier de veldenlijst, gebruik geen * in een procedure]
        from dbo.JMDQ_View
        Where Jaar = @Jaar
        And Maand = @Maand
         Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch;
    
     end
end

Daan geef je 0 als dag mee als je alle dagen wil zien

Afhankelijk van je tabellenstructuur zou ik zeggen: leg een index op Jaar en Maand met included columns Leeftijd, Locatie, Lijn_Nr, Batch
Ale je met procedures gaat spelen is de volgende link misschien interessant: SQL SP
 
Top dank je wel.

Wat moet er meegegeven worden als een argument wel een nvarchar is stel
Code:
@Batch nvarchar(20)
Batch = @Batch
 
datums en varchar argumenten worden tussen aanhalingstekens meegegeven1
vb: @arg1 int, @arg2 datetime, @arg3 varchar

exec Myproc 100, '2024-02-28', 'abc'
 
Dat werkt, echter wat zet ik tussen de aanhalingstekens als ik alles wil hebben net als bij de dagen, ik wil niet op en specifieke Batch selecteren?
 
Dan moet je dat binnen je procedure voorzien zoals met de dag is gebeurd. Ik zie in je code trouwens geen criterium voor batch staan, alleen een sorteervolgorde.
 
Dan moet je dat binnen je procedure voorzien zoals met de dag is gebeurd. Ik zie in je code trouwens geen criterium voor batch staan, alleen een sorteervolgorde.

Code:
Alter Procedure dbo.spJMDQ
    @Jaar Int,
    @Maand Int,
    @Dag Int,
    @Locatie nvarchar(50),
    @Lijn_Nr nvarchar(20),
    @Batch nvarchar(18),
    @Product nvarchar(50)
as
begin
    set nocount on;

    select * 
    from dbo.JMDQ_View
    Where Jaar = @Jaar 
        And Maand = @Maand
        And Dag = @Dag
        And Locatie = @Locatie
        And Lijn_Nr = @Lijn_Nr
        And Batch = @Batch
        And Product = @Product
    Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch;
end

dit is de aangepaste code
 
Voor de criteria waar je ook alle resultaten wil voor zien gebruik je de if structuur, als je op een deel van de waarde wil zoeken kan je like 'abc%' gebruiken. Opletten als je like '%abc%' gebruikt, want dan kan er geen index op dat veld gebruikt worden.
 
Voor de criteria waar je ook alle resultaten wil voor zien gebruik je de if structuur, als je op een deel van de waarde wil zoeken kan je like 'abc%' gebruiken. Opletten als je like '%abc%' gebruikt, want dan kan er geen index op dat veld gebruikt worden.
Ik ben bang dat ik mij niet goed uitdruk.

De bedoeling is dat er een filter criteria gemaakt wordt die alles omvattend is en die filtert o.b.v. wat er in opgenomen is.
Code:
exec dbo.spJMDQ 2024, 2, 0, '%', '%', '%', '%'

Code:
exec dbo.spJMDQ 2024, 2, 0, 'Locatie 2', '%', '%', '%'

Is er voor de nvarchar argumenten iets als *, %, $ of welk karakter ook zodat het alles laat zien zoals bij het int de nul is (0)?
 
select ... from ... where batch like '%'
geeft alle batches maar is niet de snelste query die je kan schrijven. Je dwingt de engine om full table scans te doen. Je kan in SSMS het query plan bekijken door in de menu Query -> Include actual execution plan aan te zetten voor je de query uitvoert.
 
in mijn beleving zou dit alle resultaten moeten geven zonder een enkel filter.

Code:
Alter Procedure dbo.spJMDQ
    @Jaar Int,
    @Maand Int,
    @Dag Int,
    @Locatie nvarchar(50),
    @Lijn_Nr nvarchar(20),
    @Batch nvarchar(18),
    @Product nvarchar(50)
as
begin
    set nocount on;

    select * 
    from dbo.JMDQ_View
    Where Jaar = @Jaar 
        And Maand = @Maand
        And Dag = @Dag
        And Locatie like '%'
        And Lijn_Nr like '%'
        And Batch like '%'
        And Product like '%'
    Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch, Product;
end

exec dbo.spJMDQ 0, 0, 0, '%', '%', '%', '%'

Die nullen werken, maar de % verstoren de boel en ik krijg geen enkele record.

Klopt mij Batch like '%' en klopt het wat ik in de EXEC heb staan of moet er iets anders in de EXEC staan.
 
Als de procedure uitgevoerd wordt zoals jij aangeeft wordt de expressie:

Code:
 select *
    from dbo.JMDQ_View
    Where Jaar = 0
        And Maand = 0
        And Dag = 0
        And Locatie like '%'
        And Lijn_Nr like '%'
        And Batch like '%'
        And Product like '%'
    Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch, Product;
wat natuurlijk geen enkele lijn zal opleveren. Bovendien hebben de criteria
Code:
 And Locatie like '%'
        And Lijn_Nr like '%'
        And Batch like '%'
        And Product like '%'
als enig resultaat dat de query veel langer gaat duren zonder enige functionaliteit toe te voegen.

Als je een procedure wil maken dat zowel een selectie op de gegeven parameters kan maken als alles weer te geven zal je echt wel met een If ... begin ... end structuur moeten werken.
Een andere optie is om met dynamisch opgebouwde sql te werken
dynamic SQL

Ik verkies hierbij te werken met sp_executesql, maar je moet het artikel in de link maar eens bekijken.
Ik zou ook error handling toevoegen, (Try/Catch)
 
Ik ben er uit zodat het werkt.

Code:
Alter Procedure dbo.spJMDQ
    @Jaar Int,
    @Maand Int,
    @Dag Int,
    @Locatie nvarchar(50),
    @Lijn_Nr nvarchar(20),
    @Batch nvarchar(18),
    @Product nvarchar(50)
as
begin
    set nocount on;

    select *
    from dbo.JMDQ_View
    Where (Jaar = @Jaar OR @Jaar = 0)
        And (Maand = @Maand OR @Maand = 0)
        And (Dag = @Dag OR @Dag = 0)
        And Locatie like @Locatie
        And Lijn_Nr like @Lijn_Nr
        And Batch like @Batch
        And Product like @Product
    Order by Leeftijd Asc, Locatie, Lijn_Nr, Batch, Product;
end

exec dbo.spJMDQ 0, 0, 0, '%', '%', '%', '%'

Er zit een access app achter die door op knoppen te drukken telkens een filter uitvoert.
Bedankt voor de hulp. Soms is het lastig de juiste vraag te stellen.
 
Aangezien je waarschijnlijk geen gegevens hebt waar de dag/maand/jaar 0 is zal dit niet veel resultaat geven vrees ik.

ik neem aan dat de criteria in Access worden opgegeven als variabelen, of uit een formulier worden gehaald.
Dan zal je iets hebben als

exec dbo.spJMDQ forms!MyForm!MyCrit1, forms!MyForm!MyCrit2, ....

of

exec dbo.spJMDQ myVar1, myVar2, ....

En het feit blijft dat de procedure zelf heel inefficiënt geschreven is. Ik zou niet weten hoe ik deze nog trager kan maken.
Probeer geen select * te gebruiken en geef geen onnodige criteria lijnen. Gebruik hiervoor de If -begin-end structuur of gebruik dynamische SQL. Vraag eventueel hulp van jullie DBA. Die zal met plezier helpen om een meer efficiënte code te schrijven om te vermijden dat de performantie van de server wordt aangetast. Want dat maakt het niet alleen voor jou trager, maar hindert ook de andere gebruikers. Als je in de rij voor de kassa staat wil je ook niet dat de persoon voor jou de doos met koekjes openmaakt en koekje voor koekje laat scannen ;-)
 
Terug
Bovenaan Onderaan