在where子句

时间:2015-08-10 16:28:49

标签: sql sql-server sql-server-2008

我在存储过程中使用SQL输入参数来选择具有各种WHERE子句的不同行。这是使用视图中的下拉列表完成的。问题是我允许用户使用下拉列表在where子句中选择运算符。

CREATE PROCEDURE SingleClauseReport
    @selectedRows varchar(1000),
    @testLeftInput varchar(100),
    @testOperatorInput varchar(10),
    @testRightInput varchar(100)
AS
BEGIN
    Select @selectedRows
    from Test
    where @testLeftInput + ' ' + @testOperatorInput + ' ' + @testRightInput;
END
GO

我收到一条错误,指出预期会出现这种情况。是否有可能做到这一点?否则我只需要使用一个运算符,如:

where @testLeftInput = @testRightInput;

2 个答案:

答案 0 :(得分:3)

你尝试过的东西不会起作用。您有两个选择:动态sql,或重写过程以对每个可能的运算符进行一次查询,然后根据参数决定执行哪个。我强烈推荐后者。

CREATE PROCEDURE SingleClauseReport
    @selectedRows varchar(1000),
    @testLeftInput varchar(100),
    @testOperatorInput varchar(10),
    @testRightInput varchar(100)
AS
BEGIN
  If @testOperatorInput  = '=' 
  Begin
    Select @selectedRows
    from Test
    where @testLeftInput = @testRightInput;
  End
  Else If @testOperatorInput  = '>' 
  Begin
    Select @selectedRows
    from Test
    where @testLeftInput > @testRightInput;
  End
  --...
END

答案 1 :(得分:0)

不要这样做:

AS
BEGIN

declare @sql nvarchar(max)

set @sql = N'Select ' + @selectedRows 
+ ' from Test where ' + @testLeftInput + ' ' 
+ @testOperatorInput + ' ' 
+  @testRightInput;

execute sp_executesql @sql

END