Est-il possible de transmettre une valeur à une procédure stockée pour lui indiquer si append ou non une instruction OR à une instruction SQL SELECT?
J'ai essayé quelque chose comme ça, mais ce n'est pas valide:
SELECT xyzName FROM xyz_fields WHERE (xyzType = 'this') UNION ALL (if @status=1 OR (xyzType = 'that')) UNION ALL (if @status2=1 OR (xyzType = 'somethingelse'))
Un peu comme la construction de la clause WHERE dans SQL plutôt que de bash à nouveau la DB à partir de l'application?
Vous pouvez utiliser Dynamic SQL pour cela.
declare @SqlQuery varchar(100) Set @SqlQuery = ' SELECT xyzName FROM xyz_fields WHERE xyzType = ''this'' ' if(@status=1) Set @SqlQuery = @SqlQuery + ' OR xyzType = ''that'' ' if(@status2=1) Set @SqlQuery = @SqlQuery + ' OR xyzType = ''somethingelse''' exec(@SqlQuery)
Les qoutes uniques dans la requête sont échappées en préfixant un autre qoute unique. Donc, dans la requête
WHERE xyzType = 'this'
devrait être
WHERE xyzType = ''this''
Je pense que tu veux dire quelque chose comme ça:
SELECT xyzName FROM xyz_fields WHERE (xyzType = 'this') OR (@status=1 AND (xyzType = 'that')) OR (@status2=1 AND (xyzType = 'somethingelse'))
La deuxième ligne de la clause where n'offre que des succès lorsque @status est égal à 1 et xyzType est égal à 'that'.
SELECT xyzName FROM xyz_fields WHERE (xyzType = 'this') OR ((xyzType = 'that') AND @status = 1) OR ((xyzType = 'somethingelse') AND @status2 = 1)
Quand @status = 1
, ((xyzType = 'that') AND @status = 1)
renvoie (xyzType = 'that')
, mais quand @status = 0
, ((xyzType = 'that') AND @status = 1)
renvoie false
et n'affectera pas votre requête.