将WHERE条件传递给存储过程

Sha*_*mim 2 t-sql sql-server

这是我的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
Run Code Online (Sandbox Code Playgroud)

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

我想只是提供字符串,并要设置在旁边的任何一个可以帮助我修正错误

Mit*_*eat 8

您需要构建动态查询.

请参阅此文章:动态SQL的诅咒和祝福.它是动态SQL的规范参考.

正如其他人所指出的那样,您应该谨慎使用动态SQL,并且在没有其他方法适合的情况下.动态SQL可以开辟SQL注入攻击的风险,并且如"动态SQL的诅咒和祝福"中所述,还有一些需要注意的细微问题.

  • +1对于Sommarskog参考 - Erland是一个非常聪明的人. (2认同)

Aar*_*ton 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
Run Code Online (Sandbox Code Playgroud)

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

  • 亚伦在这里讲的是一个有意义的世界!除非绝对必要,否则我坚信不惜一切代价避免使用Dynamic T-SQL.通常,您可以使用明确定义的代码解决给定问题.当然,你可以在这里和那里复制一些小的源代码,但你的工作的整体清晰度和质量将会非常优越.在您之后出现并且必须使用您的源代码的可怜的老DBA /编码员将会非常感激它;-). (4认同)