J'essaie d'utiliser l'opérateur AND dans une variable et de l'utiliser dans la clause WHERE. J'essaie de faire cela sans utiliser Dynamic SQL. c'est-à-dire sans affecter l'ensemble de la requête à une variable.

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      + @v_Criteria

J'ai utilisé l'opérateur + avant le @v_Criteria et je n'obtiens aucun résultat. Si j'utilise & opertor avant @v_Criteria, j'obtiens une erreur. Toute aide serait grandement appréciée

0
KMR 23 mai 2018 à 10:58

3 réponses

Meilleure réponse

Vous ne pouvez pas ajouter une "chaîne" à une requête et elle fera partie du code. Ce n'est encore qu'une chaîne. Essentiellement, vous essayez de faire du SQL dynamique, mais vous dites ensuite que vous ne voulez pas de SQL dynamique?

Une option consiste à créer la logique pour les deux cas en SQL ...

SELECT *
FROM tblJobs
WHERE JobID NOT IN (63,87,469)    
  AND JobType LIKE '%' + @jobtype + '%'
  AND (
    (@inparam ='Report1')
    OR 
    (@inparam ='Report2' AND InvoiceValue IS NOT NULL)
  )

Cela signifie que le planificateur de requêtes doit gérer les deux cas en permanence. Un plan pour résoudre les deux cas. Cela vous évite de taper, mais cela peut signifier que vous obtenez un plan d'exécution médiocre et que vous gaspillez des ressources ou du temps d'exécution.

Pour contourner cela, vous avez besoin de deux requêtes ...

IF (@inparam = 'Report1')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
END
ELSE IF (@inparam = 'Report2')
BEGIN
  SELECT *
  FROM tblJobs
  WHERE JobID NOT IN (63,87,469)    
    AND JobType LIKE '%' + @jobtype + '%'
    AND InvoiceValue IS NOT NULL
END

Ou utilisez simplement Dynamic SQL ...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%''' + @jobtype + '%''' + @v_Criteria

EXEC sp_executesql @sql

Ou...

SET @sql= 'SELECT *
             FROM tblJobs
            WHERE JobID NOT IN (63,87,469)    
              AND JobType LIKE ''%'' + @jobtype_param + ''%''' + @v_Criteria

EXEC sp_executesql
         @sql,
         N'@jobtype_param varchar(500)',
         @jobtype_param = @jobtype

(L'avantage ici est que vous ne créerez pas de nouveau plan de requête en cache pour chaque @jopbtype. Au lieu de cela, il crée un plan de requête paramétré et le réutilise.)


EDIT:

Fondamentalement, vous étudiez la recherche dynamique.

Si jamais cela devient plus complexe que cet exemple, je vous recommande vivement de lire cet article: http: // www .sommarskog.se / dyn-search.html

C'est compliqué et approfondi, et vous apprendrez beaucoup de leçons précieuses.

0
MatBailie 23 mai 2018 à 08:19

Avant d'ajouter "AND" si vous vérifiez si @v_Criteria n'est pas une chaîne vide, vous n'obtiendrez aucune erreur.

Donc, séparez AND par exemple de "AND InvoiceValue IS NOT NULL" Puis ajoutez AND ou non en fonction de la valeur du @v_Criteria

0
Eralper 23 mai 2018 à 08:02

Et cette solution?

DECLARE @v_Criteria varchar(500)
DECLARE @jobtype varchar(500) = 'test Job'

    IF @inparam ='Report1'
        BEGIN
            SET @v_Criteria= ''
        END
    ELSE IF @inparam='Report2'
        BEGIN
            SET @v_Criteria= ' AND InvoiceValue IS NOT NULL'
        END


    SELECT *
    FROM tblJobs
    WHERE  JobID NOT IN (63,87,469)    
      AND JobType LIKE '%' + @jobtype + '%' 
      AND ISNULL(InvoiceValue, '') NOT LIKE CASE
                                                 WHEN @inparam = 'Report2'
                                                 THEN ''
                                                 ELSE 'SOMEIMPOSSIBLEVALUE'
                                                 END
0
B3S 23 mai 2018 à 08:07