将WHERE条件传递给存储过程

时间:2009-06-21 02:28:52

标签: sql-server tsql

这是我的Storprocedure

CREATE PROCEDURE [B]

 @BoardID varchar(5000)

AS

declare @sB varchar(8000)
set @sB= ' '


Select name,id,address  from BoardDetail

WHere IsActive=1 and @sB=@BoardID
GO

这里我发送字符串参数....我的 @BoardID 包含字符串条件,如: name = a和id = 5 and address = adfas

我想提供只是字符串并希望在旁边设置,可以帮助我修复错误

7 个答案:

答案 0 :(得分:8)

您需要构建动态查询。

请参阅此文章:The Curse and Blessings of Dynamic SQL。它是动态SQL的规范参考。

正如其他人所说,你应该谨慎地使用动态SQL,并且在没有其他方法适合的情况下。动态SQL可以开辟SQL注入攻击的风险,正如“动态SQL的诅咒和祝福”中所提到的,还有一些需要注意的细微问题。

答案 1 :(得分:6)

这是一个非常糟糕的做法。这将限制您验证SQL参数,减少或消除查询计划重用的能力,并且可能会扩大臭氧层中的漏洞。

我开玩笑说最后一个 - 不是前两个。

仅仅创建三个参数会好得多:

CREATE PROCEDURE B
  @name varchar(10),
  @id int,
  @address varchar(20)
AS
BEGIN
  SELECT name, address FROM BoardDetail
  WHERE IsActive = 1 AND BoardID = @id AND name = @name AND address = @address
END

相信我 - 地狱之路是用连接的查询字符串铺平的。

答案 2 :(得分:1)

您可以使用动态SQL,execsp_executesql

来实现
CREATE PROCEDURE [B]
    @BoardWhere varchar(5000)
AS
declare @query varchar(8000)
set @query = 'Select name,id,address from BoardDetail where ' + @BoardWhere
exec (@query)

最佳做法是在声明存储过程时给出模式名称,例如:

CREATE PROCEDURE dbo.[B]

而且,存储过程对sql注入是开放的,所以要知道你给谁执行权限。例如,某人可能会将“1 = 1”作为一个参数传递,甚至更糟糕的事情。

答案 3 :(得分:1)

如果您想要在运行时传递多个搜索项,则可以执行此操作而不是使用动态SQl。请记住,如果可以避免使用动态SQL通常是一种不好的做法。

从mytable中选择* where(my_ID = @my_id或@my_id IS NULL) 和(client_id = @client_id或@client_id为空)

答案 4 :(得分:0)

嗯,你不能这样做。查看本文有两种方法dynamic where clauses

答案 5 :(得分:0)

你认为这是错误的(没有错,但是从框架如何让你使用它来歪曲)。

您尝试将SQL作为参数传递,然后将其附加到您拥有的SQL中。这可以使用dynamic SQL但不能没有它 - 而且你没有使用它。

你真正在做的是比较:

WHere IsActive=1 and @sB=@BoardID
becomes:
WHere IsActive=1 and ' '='name=5 and id=6'

当然不会返回任何结果,因为空字符串不等于包含这些字符的字符串。

答案 6 :(得分:0)

您正在尝试检查不存在的列

从BoardDetail中选择姓名,ID,地址

WHAre IsActive = 1且@ sB = @ BoardID

@sB是一个始终为NULL的变量,永远不会是= @BoardDetail

如果您尝试根据参数@BoardDetail ='name = a和id = 5以及address = adfas'发送的字符串值进行选择,请尝试以下操作:

创建程序[B]

@BoardID varchar(5000)

AS

声明@cmd varchar(8000)

SET @cmd ='从BoardDetail选择名称,ID,地址WHere IsActive = 1和'+ @BoardID

执行(@CMD)

拉​​吉