我希望将变量作为条件传递&#;;<,>,+,='在SQL中,但不确定正确的方法,无法在网上找到任何帮助我。
基本上,我有一些信息,我需要在发票上看到买卖方,并且不需要两个单独的程序。
示例是:
SELECT * FROM Details
WHERE Credit @Direction 0
@Direction可能是<,>或=
答案 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 '>'