条件作为SQL中的变量
我希望在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 = '
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更新了您的想法。非常好的提示。:)