--建表
create   table   T(ID   int,   Name   char(1))   
--插入数据
insert   T   select   1,   'a'   
insert   T   select   2,   'b'   
insert   T   select   3,   'c'   
insert   T   select   4,   'd'   
insert   T   select   5,   'e'   
insert   T   select   6,   'a'   --新建存储过程    
create   proc   pc   
@Name   varchar(100)   
as   
exec('   select * from T where Name in('+@Name+')')   
go   
    
--调用存储过程
exec   pc   '''a'',''b'''--SQL语句用参数
declare @Name varchar(50)    
set @Name='''a'',''b'''--这个值应该怎么写,才能获得上面存储过程查到的记录(现在无记录)
select * from t where [Name] in (@Name)
最后一个SQL语句我要用参数来获得这个名称列表,请问大家,这个参数值应该怎么写?
我百度查到的是以前CSDN上朋友写的,存储过程里的写法,但是在SQL语句里却行不同。set @Name='''a'',''b''' --查不到记录
set @Name='a','b'--语法错误
set @Name='a,b'--查不到记录谢谢! :)

解决方案 »

  1.   

    没法写,只能用动态SQL拼字符串。
      

  2.   

    set @Name='a,b'
    select * from t where [Name] in (@Name)这两句话的意思是,在表T中查找 name ='a,b' 的纪录,你的纪录没有name ='a,b'的,当然查不到了。
      

  3.   


    恩,这个明白。
    我要的是最后SQL语句是  where name in ('a','b') 的记录。这个set语句应该怎么写?
      

  4.   

    那就先把字符串 'a,b' 拆分成两条记录存放到表变量中,然后再 select ... in ()
      

  5.   

    declare @tag varchar(1000);
    set @tag ='a,b';
    select * from T where [name] in (
        select b.tag from   
          (select tag=convert(xml,'<root><v>'+replace(@Tag,',','</v><v>')+'</v></root>') )a
           outer apply (select tag=C.v.value('.','nvarchar(100)') from a.tag.nodes('/root/v')C(v))b 
    )
      

  6.   

    declare @Name varchar(50)    
    set @Name='''a'',''b'''--这个值应该怎么写,才能获得上面存储过程查到的记录(现在无记录)
    SELECT @name 
    EXEC (
    'select * from t where [Name] in (' + @Name+')')
      

  7.   


    螃蟹,这个执行成功,是我要的内容。 谢谢。呼呼 ,我实际操作的SQL语句好长的,5555,还得仔细修改下。。
      

  8.   


    螃蟹,这个执行成功,是我要的内容。 谢谢。呼呼 ,我实际操作的SQL语句好长的,5555,还得仔细修改下。。
      

  9.   

    还有更优的方法不?(小小贪心一下,因为有三个SQL语句同时用到这个参数,都是多表查的,比较复杂的语句,螃蟹的方法是对的,就是语句太多了点,嘎嘎)
      

  10.   


    --SQL语句用参数
    declare @Name varchar(50)    
    set @Name='''a'',''b'''--这个值应该怎么写,才能获得上面存储过程查到的记录(现在无记录)
    select * from t where charindex([Name],@Name)>0
      

  11.   


    这两个方式也不错,只是我参数是用SqlParameter写(ASP.NET程序),所以执行时提示“必须声明标量变量 "@Name"。”替换到我的实际SQL语句里,提示:“必须声明标量变量 "@Name"。b附近有语法错误。”。我替换时,就是把in语句后面的小括号内容放进去,其中@Tag换成我实际的参数名称名称@ServiceTagLlist必须声明变量的错误,是因为我是用集成的参数所有参数都通过调用一个方法PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);处理的。好象不适用这个SQL语句
      

  12.   

    这两个方式也不错,只是我参数是用SqlParameter写(ASP.NET程序),所以执行时提示“必须声明标量变量 "@Name"。” 
    ------------------------------------------------------------------------------------------------------------
    用存储过程
      

  13.   


    这个是最优的做法,我上午执行出错,提示:必须声明标量变量 "@Name"
    是因为我实际变量名多了个字母导致SQL语句的的变量名和我参数里的名称不同。对不起各位拉。。西西非常感谢。。我结贴了。