Question

J'ai un rapport dans SSRS 2005 qui repose sur une requête similaire à celle-ci:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

Je dois pouvoir inclure de manière dynamique la partie AND de la clause WHERE dans la requête, selon que l'utilisateur a coché ou non une case à cocher. Fondamentalement, il s'agit d'une instruction SQL dynamique et c'est le problème. J'ai essayé plusieurs approches en vain. Est-ce possible? Est-ce que SSRS 2005 prend en charge le SQL dynamique? Merci!

Était-ce utile?

La solution

Charles avait presque la bonne réponse.

Cela devrait être:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
   AND (@checked = 0 OR col2 LIKE '%XYZ%')

Il s'agit d'un "motif" classique. en SQL pour les prédicats conditionnels. Si @checked = 0 , toutes les lignes correspondant au reste du prédicat seront renvoyées ( col1 = 'ABC' ). SQL Server ne traitera même pas la seconde moitié du OU .

Si @checked = 1 , il évaluera la deuxième partie du OU et renverra les lignes correspondant à col1 = 'ABC' ET col2 LIKE '% XYZ % '

Si vous avez plusieurs prédicats conditionnels, ils peuvent être chaînés à l'aide de cette méthode (alors que les méthodes IF et CASE deviendraient rapidement ingérables).

Par exemple:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
    AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
    AND (@checked2 = 0 OR col3 LIKE '%MNO%')

N'utilisez pas de SQL dynamique, n'utilisez pas IF ou CASE.

Autres conseils

Qu'en est-il de cela? @checked est votre variable bit.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

Modifier: également, si vous n'utilisez pas de proc stocké, utilisez-en un.

Peut-être que cela fonctionnerait pour vous:

if @checked = 1
    select * from mytable (nolock) where col = 'ABC'
else
    select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'

Je suis désolé de ne pas utiliser beaucoup SSRS, mais si vous pouvez obtenir la valeur de la case à cocher dans le paramètre @checked, cela devrait fonctionner.

Vous pouvez également utiliser une instruction CASE WHEN.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END

Cela fonctionnerait dans SSRS 2000 mais en dernier recours.

(mauvais) PSEUDOCODE

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

Découvrez Exécution de" Dynamique " Requêtes SQL . du Guide de l'auto-stoppeur à SQL Server 2000 Reporting Services

Pour cela, vous pouvez générer la requête SSRS sous forme d’expression. Dans le concepteur de rapports BIDS, définissez votre requête comme suit:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")

si vous pouvez utiliser des procédures stockées, il est probablement plus facile de le faire ici. passez dans vos params. Créez une chaîne SQL en fonction de vos conditions et effectuez un EXEC sur la chaîne SQL, votre procédure stockée renverra les résultats dont vous avez besoin.

Vous pouvez également adopter une autre approche et utiliser la fonction Exec:

DECLARE @CommonSelectText varchar(2000)  
DECLARE @CompleteSelectText varchar(2000)  
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '  

IF @checked = 1   
    SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '  
ELSE  
    SELECT @CompleteSelectText = @CommonSelectText  

EXEC (@CompleteSelectText)  

GO  

Notez l'utilisation de deux apostrophes ' pour marquer le texte cité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top