--建表
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'--查不到记录谢谢! :)
select * from t where [Name] in (@Name)这两句话的意思是,在表T中查找 name ='a,b' 的纪录,你的纪录没有name ='a,b'的,当然查不到了。
恩,这个明白。
我要的是最后SQL语句是 where name in ('a','b') 的记录。这个set语句应该怎么写?
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
)
set @Name='''a'',''b'''--这个值应该怎么写,才能获得上面存储过程查到的记录(现在无记录)
SELECT @name
EXEC (
'select * from t where [Name] in (' + @Name+')')
螃蟹,这个执行成功,是我要的内容。 谢谢。呼呼 ,我实际操作的SQL语句好长的,5555,还得仔细修改下。。
螃蟹,这个执行成功,是我要的内容。 谢谢。呼呼 ,我实际操作的SQL语句好长的,5555,还得仔细修改下。。
--SQL语句用参数
declare @Name varchar(50)
set @Name='''a'',''b'''--这个值应该怎么写,才能获得上面存储过程查到的记录(现在无记录)
select * from t where charindex([Name],@Name)>0
这两个方式也不错,只是我参数是用SqlParameter写(ASP.NET程序),所以执行时提示“必须声明标量变量 "@Name"。”替换到我的实际SQL语句里,提示:“必须声明标量变量 "@Name"。b附近有语法错误。”。我替换时,就是把in语句后面的小括号内容放进去,其中@Tag换成我实际的参数名称名称@ServiceTagLlist必须声明变量的错误,是因为我是用集成的参数所有参数都通过调用一个方法PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);处理的。好象不适用这个SQL语句
------------------------------------------------------------------------------------------------------------
用存储过程
这个是最优的做法,我上午执行出错,提示:必须声明标量变量 "@Name"
是因为我实际变量名多了个字母导致SQL语句的的变量名和我参数里的名称不同。对不起各位拉。。西西非常感谢。。我结贴了。