条件作为SQL中的变量

时间:2018-04-13 09:20:57

标签: sql sql-server

我希望将变量作为条件传递&#;;<,>,+,='在SQL中,但不确定正确的方法,无法在网上找到任何帮助我。

基本上,我有一些信息,我需要在发票上看到买卖方,并且不需要两个单独的程序。

示例是:

SELECT * FROM Details
WHERE Credit @Direction 0

@Direction可能是<,>或=

3 个答案:

答案 0 :(得分:2)

你不能这样做。不过有几种选择。

第一种方法是使用几个OR表达式。

DECLARE @Direction varchar(2);

SET @Direction = '=';

SELECT *
FROM YourTable
WHERE (YourColumn = 0 AND @Direction = '=')
   OR (YourColumn > 0 AND @Direction = '>')
   OR (YourColumn < 0 AND @Direction = '<')
   OR (YourColumn != 0 AND @Direction = '!=')
   OR (YourColumn >= 0 AND @Direction = '>=')
   OR (YourColumn <= 0 AND @Direction = '<=');
然而,这可能会在表现上遭受可怕的损失。

因此,另一种选择是使用动态SQL:

DECLARE @Direction nvarchar(2);
SET @Direction = N'=';

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT *' + NCHAR(10) +
           N'FROM YourTable' + NCHAR(10) +
           N'WHERE YourColumn ' + @Direction + N'0;';
PRINT @SQL; --This is your best friend
EXEC sp_executesql @SQL;

然而,非常重要的是,你不要增加值@Direction的长度,否则你可以自己选择注射。

如果您传递了一个值,而不是总是与0进行比较,那么请使用类似的内容。 *编辑:还添加了对Direction参数值的验证检查,如果它不有效,则添加RAISERROR

DECLARE @Direction nvarchar(2), @i int;
SET @Direction = N'!'; --Intentionally incorrect
SET @i = 0;


IF @Direction NOT IN (N'=',N'>',N'<',N'!=',N'>=',N'<=') BEGIN

    DECLARE @Error nvarchar(500) = N'Direction parameter has an invalid value (''' + @Direction + N'''). Accepted values are =,<,>,!=,>= and <=.';         
    RAISERROR(@Error, 11, -1);

END ELSE BEGIN

    DECLARE @SQL nvarchar(MAX);

    SET @SQL = N'SELECT *' + NCHAR(10) +
               N'FROM YourTable' + NCHAR(10) +
               N'WHERE YourColumn ' + @Direction + N' @si';
    PRINT @SQL; --This is your best friend
    EXEC sp_executesql @SQL, N'@si int', @si = @i;

END

答案 1 :(得分:1)

使用EXEC实现同样的目标。 e.g。

Declare @Direction nvarchar(10) 
Declare @Query nvarchar(1000)

Set @Direction = '<'

Set @query = 'SELECT * FROM Details WHERE Credit ' + @Direction + '0'

EXEC sp_executsql @query

答案 2 :(得分:0)

您可以使用动态SQL。在过程中,您必须准备查询并通过传递@direction来执行SP。像下面的东西。

Create proc test 
@Direction varchar(2)
AS
(
Declare @SQL nvarchar(max)
set @SQL='SELECT * FROM Details WHERE Credit '+@direction+ ' 0'
Exec (@SQL)
)

Exec test '>'