日期:2014-05-17  浏览次数:20957 次

讲带单引号的字符串传递给SQL存储过程

string s="";

for (int i = 0; i < datagridview1.SelectedRows.Count; i++)
{
  s = s +"'"+ datagridview1.SelectedRows[i].Cells[0].Value.ToString() +"',";
}



我想得到s的值为:'123','234','456' 这种样式的,
用我上面的代码得到的结果是 ''123'',''456'' 这种样式,多了一对单引号,怎么处理

------解决方案--------------------
上面只是针对SQL Server对单个字符常量的基本语法而言。如针对lz问题,这个 s = s.Replace("'", "''"); 是错误的。



引用:
C# code?123456string s=""; for (int i = 0; i < datagridview1.SelectedRows.Count; i++){  s = s +"'"+ datagridview1.SelectedRows[i].Cells[0].Value.ToString() +"',";}


我想得到s的值为:'123','23……

string s="";
 
for (int i = 0; i < datagridview1.SelectedRows.Count; i++)
{
  s = s +"'"+ datagridview1.SelectedRows[i].Cells[0].Value.ToString().Replace("'","''") +"',";
}

------解决方案--------------------
额,问题不在这里了。我想你的 ''123'',''456'' 也不会是在vs里得到滴,估计你是在sql profile里监控出来的,你的代码里拼接出来的确是'123','234','456',  这不过ado.net 内部在传递带引号的数据时,会自动替换‘,为''为sql做转译

当然你问题是实质其实在存储过程里面,我估计你是这么写滴 xx in (@parm),这么写是不成滴

解决方法一:在存储过程里动态拼接sql
declare @sql nvarchar(4000)
set @sql= 'select * from table1 where xx in ('+@parm+')'
exec(@sql)


方法二:存储过程里

select * from table1 where ','+@parm+',' like '%,'+xx+',%'--(这里可以用like,也可以用charindex,自己看着办)
 

方法三:google“t_sql splite”找到如何把这玩意转成行集,利用行集(方法有利用charindex,利用递归,利用replece替换成xml,在用xmlpath查询节点)

 如果你已经有splite函数,这可以 select * from table1 where xx in(splite(@parm,','))