条件作为SQL中的变量

条件作为SQL中的变量,sql,sql-server,Sql,Sql Server,我希望在SQL中以条件“,+,=”的形式传递一个变量,但不确定正确的方法,并且无法在网上找到任何帮助我的方法 基本上,我有需要在发票上看到买卖双方的信息,不需要两个单独的程序 例如: SELECT * FROM Details WHERE Credit @Direction 0 @方向可以是或=使用EXEC实现相同的目标。e、 g Declare @Direction nvarchar(10) Declare @Query nvarchar(1000) Set @Direction = '

我希望在SQL中以条件“,+,=”的形式传递一个变量,但不确定正确的方法,并且无法在网上找到任何帮助我的方法

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

例如:

SELECT * FROM Details
WHERE Credit @Direction 0

@方向可以是或=

使用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
Declare@Direction-nvarchar(10)
声明@Query nvarchar(1000)

设置@Direction='使用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
Declare@Direction-nvarchar(10)
声明@Query nvarchar(1000)

设置@Direction='您可以使用动态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 '>'

您可以使用动态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 '>'

你不能那样做不。不过你有几个选择

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

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 = '<=');
但是,非常重要的是,不要增加值
@Direction
的长度,否则您将选择注入

如果要传递一个值,而不是总是与
0
进行比较,那么请使用类似的方法*编辑:还添加了对方向参数值的验证检查,如果该参数无效,请执行以下操作:
RAISERROR

声明@Direction nvarchar(2),@i int;
设置@Direction=N'!'--故意不正确
设置@i=0;

如果@Direction不在(N'=',N'>',N'=',N'=和中,你就不能那样做不。不过,有几个选项可以选择

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

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 = '<=');
但是,非常重要的是,不要增加值
@Direction
的长度,否则您将选择注入

如果要传递一个值,而不是总是与
0
进行比较,则使用类似的方法。*编辑:还添加了对方向参数值的验证检查,如果无效,则使用
RAISERROR
):

声明@Direction nvarchar(2),@i int;
设置@Direction=N'!'--故意不正确
设置@i=0;

如果@方向不在(N'=',N'>',N'=',N'=您需要动态sql来实现这一点,有很多这样的例子。您可以向我们展示更多您的过程吗?也许我们可以为您的问题提供另一种方法的输入?您需要动态sql来实现这一点,有很多这样的例子。您可以向我们展示更多您的过程吗?也许我们可以在另一种方法上提供输入r解决问题的方法?您还需要将该值作为第二个参数传递,这样它就不必总是与“0”进行比较。您还需要将该值作为第二个参数传递,这样它就不必总是与“0”进行比较。对于注入警告+1,我看到太多的答案,因此对注入@GuidoG开放,这让我感到害怕。相反与依赖两个字符不足以进行注入这一事实相比,我可能更愿意实际检查
@Direction
的值,在这种情况下,根据所有可能的情况进行检查。另外,如果意外传递了无效值,这会给您带来明显的错误,而不是关于无效SQL的神秘错误。通常,检查“想尽一切办法防止注射当然是不可能的,但在这种情况下确实如此。”JeroenMostert更新了你的想法。非常好的提示。:)对于注入警告+1,我看到太多的答案,以至于对注入@GuidoG开放,这让我很害怕。与其依赖于两个字符不足以进行注入,我可能更愿意实际检查
@Direction
的值是否与本例中的所有可能性相符。作为奖励,这会给您提供清晰的e如果意外传递了无效值,而不是关于无效SQL的神秘错误,则会出现错误。通常情况下,检查输入是否存在防止注入的所有可能性是不可能的,当然,在这种情况下是不可能的。@Jeroenmoster更新了您的想法。非常好的提示。:)