0
votes

Dynamique où clause sql boucle

Voici la procédure stockée

...AND ((val Between 48 and 51) or (val Between 60 and 99) or (val Between 75 and 203))
  • Tous les paramètres peuvent être séparés par des virgules li>
  • @ param1 valeur peut être "Allemagne" ou "Allemagne, USA" ou NULL. Cela fonctionne comme prévu. LI>
  • pareille la même chose pour @ param2 li> ul>

    J'essaie d'inclure le reste des paramètres qui devrait fonctionner comme suit: p>

    @ start = '0' et @ fin = '100': dans ce cas, où la clause ressemblera à ce p> xxx pré>

    @ start = '48, 60 'et @ fin = '51, 99': Dans ce cas, où la clause ressemblera à ceci xxx pré>

    @ start = '48, 60,75 'et @ end = '51, 99,203': dans ce cas, où la clause ressemblera à ce p>

    ...AND ((val Between 48 and 51) or (val Between 60 and 99))
    


6 commentaires

Avez-vous vraiment besoin de faire cela? Votre requête va être très complexe


Pouvez-vous recevoir une table temporaire chargée avec toutes ces valeurs au lieu de paramètres? De cette façon, ce serait simplement une jointure.


Pouvez-vous inclure des données d'échantillon et un cas de test de sortie attendu sage? Ce sera utile.


@Squirrel: J'ai la sélection de la plage de code (C #). Je peux modifier la manière dont les paramètres sont transmis de code à DB. Les sélections sont comme '48, 51 ',' 60,99 ', etc. Toute suggestion s'il vous plaît?


Comme @squirrel dit auparavant, il sera très complexe, surtout si @start et @end peut contenir plusieurs valeurs. Ainsi, vous aurez besoin d'une dynamicsql que je n'ai pas recommandé.


Faites-nous savoir la définition de délimited_list_to_table ('', '')


3 Réponses :


0
votes

OK, je pense que la meilleure approche ici serait d'utiliser des tables Temp ou une variable de table. Laisse aller avec des tables Temps.

...
join #StartEnd on val between start and end
...

and exists (select 1 from #StartEnd where val between start and end)


0 commentaires

0
votes

Voilà y aller. Les commentaires / explications sont dans la requête

-- create a sample table
declare @tbl table
(
    val int
)

-- put in some sample data
insert into @tbl 
values (48), (60), (51), (99), (75), (203)

-- these are the input parameter
declare @start  varchar(100),
        @end    varchar(100)

-- and these are the input value
select  @start  = '48,60,75',
    @end    = '51,99,203'

-- the actual query
; with 
start_end as
(
    -- here i am using [DelimitedSplit8K][1]
    select  s = s.Item, e = e.Item
    from    dbo.[DelimitedSplit8K](@start, ',') s
            inner join dbo.[DelimitedSplit8K](@end, ',') e
            on  s.ItemNumber    = e.ItemNumber
)
select  t.val
from    @tbl t
where   exists
(
        select  *
        from    start_end x
        where   t.val   between x.s and x.e
)


0 commentaires

0
votes

Structure d'échantillon (à partir de notre compréhension, nous devinons vos données): xxx

procédure (vous utilisez simplement cela au lieu de Votre procédure): xxx

appel SP xxx

fonction (Appelé de SP): xxx

nous revers, si requis besoin de mettre à jour.


0 commentaires