我在存储过程中使用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;
答案 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