小弟基础浅薄,还请大家别怪。执行下列sql为什么会报错呢?
alter proc proc_test 
@name varchar(20)
as
  declare @sql nvarchar(200)
 
set @sql =N'  select * from k_memberCus where name like @name'
exec sp_execute @sql
go
exec proc_test 'M'''错误:过程需要参数 '@handle' 为 'int' 类型。
描述:如果我一定要将@name在这里参数化输入进去,应该怎么处理. 
不可以使用字符串拼接的方法。

解决方案 »

  1.   

    set @sql =N'  select * from k_memberCus where name like @name'
    你这样就是一个字符串了 你要这样只能字符串拼接
      

  2.   

    alter proc proc_test 
    @name varchar(20)
    as
      declare @sql nvarchar(200)
     
    set @sql = N'select * from k_memberCus where name like ''%' + @name + '%'''
    exec sp_execute @sql
    go
    exec proc_test 'M'
      

  3.   

    to wxf163:谢谢你。 网上说sp_execute 函数可以实现参数化传递,那么能请你写一个吗?就根据我上面写的那个,@name仍然是作为参数。
      

  4.   

    to dawugui: 谢谢你,你这样写我怕别人在传递@name时 注入了其他的SQL怎么办?
      

  5.   

    他这就是参数化传递至于你想要的 我猜是程序里面的这种参数占位符SqlParameter parm = new SqlParameter("@PageSize",SqlDbType.Int);
      

  6.   

    declare @sql nvarchar(200)
    set @sql =N'select * from k_memberCus where name like ''%'+ @name +'%'''
    EXEC(@sql)
    --或者
    declare @sql nvarchar(200)
    set @sql =N'select * from tb where aaa like ''%'+ @name + '%'''
    exec sp_executesql @sql, N'@name varchar(20)', @name
      

  7.   

     to wxf163:谢谢你。 就是不想在程序里使用SqlParameter,因为我必须在存储过程里面拼装Sql,
     dawugui的方法我会,不过这样会被注入哇?
      

  8.   

    to dawugui:谢谢。呵呵,不是多虑啊,这是必须要考虑的吧。
    其实也许我的问题是否可以说 如何在 拼装的Sql里面使用参数化的变量?
      

  9.   

    to wwwwgou: 第一条和第二条应该是一样的吧?
      

  10.   

    你主要注意尽量少用exec ()
    exec sp_executesql 这俩就可以了你这样写,你觉得怎么才能注入呢?
     select * from tb where aaa like '%' + @name + '%' 
      

  11.   

    to wxf163 : 谢谢。 个人浅见,如果@name 传递的值为 1'%' or 1 like '%'1 ,
    不知道这样语法有没有错,但是相信你还是能够理解我的。
      

  12.   

    随便你怎么试 
    declare @name  varchar(20)
    set @name='''or 1=1;select 1'
    select * from jqfx where [bb] like '%' + @name + '%'
      

  13.   

    尽量少用exec ()
    exec sp_executesql 这俩就可以了
      

  14.   

    to wxf163: 鸣谢。我要试多几次,你说尽量少用那2个,但是我的存储过程里面要拼装Sql,拼装完了要执行啊?
      

  15.   

    to wxf163: 非常感谢一直的跟进,其实我要说的问题可以用以下的来表达:
     declare @name varchar(100),@sql varchar(2000)
     set @name ='1%'' or 1 like ''%1'
     set @sql ='select * from k_memberCus where cusName like ''%' + @name + '%'' '
     exec (@sql)
    注:很明显@name被注入了.不过我想知道的问题是如何保证@name的安全性,但是又不放弃'这样的符号。
    (跟程序没有关系,我说纯SQL的)
      

  16.   

    to wxf163 : 继续鸣谢,太给力了。我要写的SQL其实是一个必须用exec执行的sql,因为还要判断很多条件进行拼装。没办法,这样执行的Sql 如果传递了字符串变量,如何防止别人类似我上述的注入啊?
      

  17.   

    to wxf163: 谢谢。难道是我走到死胡同了吗?
      

  18.   

    如果你必须要用exec ,那就要前台程序过滤,避免注入字符存储过程里参数替换 比如 ' 替换成''最好的方法还是用程序来拼字符串
      

  19.   

    set @name ='1%'' or 1 like ''%1'
     set @name = replace(@name,'''','''''')
      

  20.   

    to wxf163:谢谢,预祝新年愉快。结贴吧。如果联系到程序的话,就不是什么问题了。我原本只想,或许在sql里面有像程序Sqlparameter这样的东西。非常感谢。