【问题标题】:Pass comparison operators as parameters and use directly in SQL stored procedure将比较运算符作为参数传递,直接在 SQL 存储过程中使用
【发布时间】: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 字符的字符串。因此,如果您尝试传入 &gt;= 作为条件,它会被截断为 &gt;
  • @JRLamber 这是 MSSQL
  • 是什么让您认为@condition@WhereClause 根本不同。您已经知道如何将字符串组合在一起 - 我看不到您在写 '@WhereClause'

标签: sql sql-server stored-procedures parameters


【解决方案1】:

可以这样做吗? 可以

只需在条件之间添加一个空格即可避免语法错误

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

【讨论】:

    【解决方案2】:

    我建议不要为此使用动态 sql。
    我相信以下查询应该返回与动态 sql 版本相同的结果:

    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)
    )
    

    【讨论】:

    • 这就是办法!
    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多