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?
Il serait utile si vous avez repéré ce serveur que vous utilisez. MySQL? MSSQL? – JRLambert
[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 '>' –
@JRLamber C'est MSSQL –