这是我的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
我想提供只是字符串并希望在旁边设置,可以帮助我修复错误
答案 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,exec或sp_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)
拉吉