2017-01-24 1 views
0

J'ai une procédure stockée SQL qui prend plusieurs paramètres. Là, je dois passer des conditions comme =, <, > et les utiliser dans la requête.Passer les opérateurs de comparaison en tant que paramètres et utiliser directement dans la procédure stockée SQL

Actuellement, je vérifie quelle est la condition et modifie une partie de la requête en fonction de celle-ci. Je veux passer la condition en paramètre et l'utiliser directement dans la requête.

Voilà comment je fais maintenant,

Je passe ces paramètres:

@software_type nvarchar(50), 
@software_id nvarchar(50), 
@condition char, 
@version_id float 

Requête:

DECLARE 
    @BaseQuery nvarchar(max) = N'SELECT DISTINCT Installed_Software.vm_name FROM Installed_Software INNER JOIN Software ON Installed_Software.software_id = Software.software_id INNER JOIN Software_Version ON Installed_Software.software_id = Software_Version.software_id AND Installed_Software.version_id = Software_Version.version_id AND Software.software_id = Software_Version.software_id', 
    @WhereClause nvarchar(max) = ' WHERE 1=1', 
    @ParamList nvarchar(max) = N'@sfType nvarchar(50),@sfId nvarchar(50),@verId float,@cond char' 

IF @software_type IS NOT NULL 
BEGIN 
    SET @WhereClause = @WhereClause + ' AND Software.software_type = @sfType'; 
END 

IF @software_id IS NOT NULL 
BEGIN 
    SET @WhereClause = @WhereClause + ' AND [email protected]'; 
END 

IF @version_id IS NOT NULL AND @condition IS NOT NULL 
BEGIN 
    IF @condition = '=' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id = @verId'; 
    END 
    ELSE IF @condition ='>' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id > @verId'; 
    END 
    ELSE IF @condition='<' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id < @verId'; 
    END 
    ELSE IF @condition = '>=' 
    BEGIN 
     SET @[email protected] + ' AND Installed_Software.version_id >= @verId'; 
    END 
    ELSE IF @condition='<=' 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id <= @verId'; 
    END 
    ELSE 
    BEGIN 
     SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id = @verId'; 
    END 
END 

SET @BaseQuery = @BaseQuery + @WhereClause; 

EXECUTE sp_executesql @BaseQuery, @ParamList, @[email protected]_type, @[email protected]_id, @[email protected]_id; 

Ce que je veux faire quelque chose comme ceci:

IF @version_id IS NOT NULL AND @condition IS NOT NULL 
BEGIN  
    SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id' + '@condition' + '@version_id'; 
END 

Est-ce possible de faire ça?

+1

Il serait utile si vous avez repéré ce serveur que vous utilisez. MySQL? MSSQL? – JRLambert

+1

[Mauvaises habitudes à lancer: déclarer VARCHAR sans (longueur)] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx) - vous devriez ** toujours ** fournir une longueur pour toutes les variables et paramètres 'char/varchar' que vous utilisez. À l'heure actuelle, votre paramètre '@ condition' est simplement' CHAR', ce qui donne une chaîne de ** exactement UN ** caractère de longueur. Donc, si vous essayez de passer dans '> =' comme condition, il est tronqué à juste '>' –

+0

@JRLamber C'est MSSQL –

Répondre

0

Est-ce possible de le faire?OUI

Ajoutez juste un espace unique entre votre condition pour éviter les erreurs de syntaxe

SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id ' + '@condition' + ' @version_id'; 
                   ----^    -----^ 
0

je suggère de ne pas utiliser SQL dynamique pour cela.
Je crois que la requête suivante doit retourner les mêmes résultats que la version SQL dynamique:

SELECT DISTINCT Installed_Software.vm_name 
FROM Installed_Software 
INNER JOIN Software 
    ON Installed_Software.software_id = Software.software_id 
INNER JOIN Software_Version 
    ON Installed_Software.software_id = Software_Version.software_id 
    AND Installed_Software.version_id = Software_Version.version_id 
    AND Software.software_id = Software_Version.software_id 
WHERE 
(
    @software_type IS NULL 
    OR Software.software_type = @software_type 
) 
AND 
(
    @software_id IS NULL 
    OR Installed_Software.software_id = @software_id 
) 
AND 
(
    @version_id IS NULL 
    OR @condition IS NULL 
    OR (@condition = '=' AND Installed_Software.version_id = @version_id) 
    OR (@condition = '>' AND Installed_Software.version_id > @version_id) 
    OR (@condition = '<' AND Installed_Software.version_id < @version_id) 
    OR (@condition = '>=' AND Installed_Software.version_id >= @version_id) 
    OR (@condition = '<=' AND Installed_Software.version_id <= @version_id) 
)