【发布时间】:2017-06-08 19:21:22
【问题描述】:
我有一个带有多个参数的 SQL 存储过程。在那里,我需要将条件传递为=、<、> 并在查询中使用它们。
目前我正在做的是检查条件并根据它更改查询的一部分。我想将条件作为参数传递并直接在查询中使用。
我现在就是这样,
我正在传递这些参数:
@software_type nvarchar(50),
@software_id nvarchar(50),
@condition char,
@version_id float
查询:
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 Installed_Software.software_id=@sfId';
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 @WhereClause=@WhereClause + ' 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, @sfType=@software_type, @sfId=@software_id, @verId=@version_id;
我想做的是这样的:
IF @version_id IS NOT NULL AND @condition IS NOT NULL
BEGIN
SET @WhereClause = @WhereClause + ' AND Installed_Software.version_id' + '@condition' + '@version_id';
END
这样可以吗?
【问题讨论】:
-
如果您标记您正在使用的服务器将会很有帮助。 MySQL? MSSQL?
-
Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何
char/varchar变量和参数提供长度。现在,您的参数@condition只是CHAR,这会产生一个长度为exactly ONE 字符的字符串。因此,如果您尝试传入>=作为条件,它会被截断为> -
@JRLamber 这是 MSSQL
-
是什么让您认为
@condition与@WhereClause根本不同。您已经知道如何将字符串组合在一起 - 我看不到您在写'@WhereClause'。
标签: sql sql-server stored-procedures parameters