100分 帮忙看两条语句的不同 sql探查器

heavilyarmed 2010-10-14 12:51:20
哪位大侠能解释一下 为什么语句查询的结果不相同

asp.net 的代码

StringBuilder sql = new StringBuilder();
sql.Append(" select t_people.peopleName as pName , ");
sql.Append(" t_people.peopleId as pId, ");
sql.Append(" t_people.dutyId as pdutyId, ");
sql.Append(" t_duty.dutyName as pdutyName, ");
sql.Append(" peopleWVB.peopleTel as pPhone, ");
sql.Append(" t_deptnew.deptname as deptnamea ");
sql.Append(" from t_people,peopleWVB,t_duty ,t_deptnew ");
sql.Append(" where peopleWVB.peopleId=t_people.peopleId ");
sql.Append(" and t_duty.dutyId=t_people.dutyId ");
sql.Append(" and t_deptnew.deptid=t_people.deptid ");
sql.Append(" and t_people.deptId in (@deptCodeInfo) ");
SqlParameter[] par
= {
new SqlParameter("deptCodeInfo",SqlDbType.VarChar,2000)
};
par[0].Value = value;
using (SqlDataReader reader = DbHelperSQL.ExecuteReader(sql.ToString(), par))
{
///
}



--第一段话 能查询出信息 从asp。net中发出的语句 转化成字符串是这样
select t_people.peopleName as pName ,
t_people.peopleId as pId,
t_people.dutyId as pdutyId,
t_duty.dutyName as pdutyName,
peopleWVB.peopleTel as pPhone,
t_deptnew.deptname as deptnamea
from t_people,peopleWVB,t_duty ,t_deptnew
where peopleWVB.peopleId=t_people.peopleId
and t_duty.dutyId=t_people.dutyId
and t_deptnew.deptid=t_people.deptid
and t_people.deptId in ('chujilingdao','')




--第二段话 查不到数据 从探查器看到的信息
exec sp_executesql N' select t_people.peopleName as pName ,
t_people.peopleId as pId, t_people.dutyId as pdutyId,
t_duty.dutyName as pdutyName, peopleWVB.peopleTel as pPhone,
t_deptnew.deptname as deptnamea
from t_people,peopleWVB,t_duty ,t_deptnew
where peopleWVB.peopleId=t_people.peopleId
and t_duty.dutyId=t_people.dutyId
and t_deptnew.deptid=t_people.deptid
and t_people.deptId in
(@deptCodeInfo) ',N'@deptCodeInfo varchar(2000)',@deptCodeInfo='''chujilingdao'','''''


...全文
149 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sqlcenter 的回复:]

搞错, 里面应该是4个点
(@deptCodeInfo, '''') ',N'@deptCodeInfo varchar(2000)',@deptCodeInfo='chujilingdao'
[/Quote]

探查器的信息 应该不会错吧 我的c#代码哪里写的有问题吗 ?
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sqlcenter 的回复:]

这样才行滴,看最后一行
SQL code
exec sp_executesql N' select t_people.peopleName as pName ,
t_people.peopleId as pId, t_people.dutyId as pdutyId,
t_duty.dutyName as pdutyName, peopleWVB.peopleTel ……
[/Quote]

消息 105,级别 15,状态 1,第 10 行
字符串 ') ' 后的引号不完整。
消息 102,级别 15,状态 1,第 10 行
') ' 附近有语法错误。



小弟愚笨 还请明示

第二段是探查器的信息,
我怎么改c#代码 才能查询出信息呢
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
搞错, 里面应该是4个点
(@deptCodeInfo, '''') ',N'@deptCodeInfo varchar(2000)',@deptCodeInfo='chujilingdao'
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
这样才行滴,看最后一行
exec sp_executesql N'  select t_people.peopleName as pName ,   
t_people.peopleId as pId, t_people.dutyId as pdutyId,
t_duty.dutyName as pdutyName, peopleWVB.peopleTel as pPhone,
t_deptnew.deptname as deptnamea
from t_people,peopleWVB,t_duty ,t_deptnew
where peopleWVB.peopleId=t_people.peopleId
and t_duty.dutyId=t_people.dutyId
and t_deptnew.deptid=t_people.deptid
and t_people.deptId in
(@deptCodeInfo, '') ',N'@deptCodeInfo varchar(2000)',@deptCodeInfo='chujilingdao'
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sqlcenter 的回复:]

一般都要拼的了。

也可以将@value拼成这样:
@value = ',chujilingdao,gongweihanrenda,'

@value like '%,'+deptId+',%'
或者 charindex(','+deptId+',', @value)>0

不过既然是前台,那就把它拼成 in (列表) 算了。
[/Quote]


谢谢了
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
一般都要拼的了。

也可以将@value拼成这样:
@value = ',chujilingdao,gongweihanrenda,'

@value like '%,'+deptId+',%'
或者 charindex(','+deptId+',', @value)>0

不过既然是前台,那就把它拼成 in (列表) 算了。
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sqlcenter 的回复:]

引用 12 楼 heavilyarmed 的回复:

现在看来 是value 赋值有问题 正在 测试


不是value的问题

@value = 'chujilingdao,gongweihanrenda'
SQL不能 in (@value)

这样的话等价于 deptId=@value
[/Quote]

谢谢了 ,受教了

但是 多次发送这种拼装的语句 ,是不是会影响SqlServer的识别速度(我的语句对SqlServer来说是微不足道的,但是考虑比较极端点呢,使用in的 where子句是不是只能用string来拼装了呢)


SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 heavilyarmed 的回复:]

现在看来 是value 赋值有问题 正在 测试
[/Quote]

不是value的问题

@value = 'chujilingdao,gongweihanrenda'
SQL不能 in (@value)

这样的话等价于 deptId=@value
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
或者 有什么方式 就算我每次发送的都是不带par的语句(带where) , 而数据库只认证一次呢,
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sqlcenter 的回复:]

value="chujilingdao,gongweihanrenda,''"

这种你只能直接拼在 sql 里面了,不要par了,value拼成这样

value="'chujilingdao','gongweihanrenda',''"
[/Quote]

其实 我以前是这么写的 ,但是担心SqlServer 多次认证这条会慢,所以使用了 par 现在使用par确查询不到数据,还麻烦sqlcenter 解释一下 为什么
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
最终的sql是这个:
exec sp_executesql N'  select t_people.peopleName as pName ,   
t_people.peopleId as pId, t_people.dutyId as pdutyId,
t_duty.dutyName as pdutyName, peopleWVB.peopleTel as pPhone,
t_deptnew.deptname as deptnamea
from t_people,peopleWVB,t_duty ,t_deptnew
where peopleWVB.peopleId=t_people.peopleId
and t_duty.dutyId=t_people.dutyId
and t_deptnew.deptid=t_people.deptid
and t_people.deptId in
(''chujilingdao'',''gongweihanrenda'','''')'
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
现在看来 是value 赋值有问题 正在 测试
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
value="chujilingdao,gongweihanrenda,''"

这种你只能直接拼在 sql 里面了,不要par了,value拼成这样

value="'chujilingdao','gongweihanrenda',''"
fengyun142415 2010-10-14
  • 打赏
  • 举报
回复
学习一下
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复

sql.Append(" select t_people.peopleName as pName , ");
sql.Append(" t_people.peopleId as pId, ");
sql.Append(" t_people.dutyId as pdutyId, ");
sql.Append(" t_duty.dutyName as pdutyName, ");
sql.Append(" peopleWVB.peopleTel as pPhone, ");
sql.Append(" t_deptnew.deptname as deptnamea ");
sql.Append(" from t_people,peopleWVB,t_duty ,t_deptnew ");
sql.Append(" where peopleWVB.peopleId=t_people.peopleId ");
sql.Append(" and t_duty.dutyId=t_people.dutyId ");
sql.Append(" and t_deptnew.deptid=t_people.deptid ");
sql.Append(" and t_people.deptId in (@deptCodeInfo,'') ");
SqlParameter[] par
= {
new SqlParameter("deptCodeInfo",SqlDbType.VarChar,2000)
};
par[0].Value = value;
using (SqlDataReader reader = DbHelperSQL.ExecuteReader(sql.ToString(), par))

1.
sql.Append(" and t_people.deptId in (@deptCodeInfo, '''') ");

2.
value="chujilingdao,gongweihanrenda,''"

我现在改成这样了

还是没有查到信息
heavilyarmed 2010-10-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kevinwen0413 的回复:]

第一段代码不是可以查到信息吗
[/Quote]

手动拼上的string 没有问题
是不是我的c#代码有错呢 ?
SQLCenter 2010-10-14
  • 打赏
  • 举报
回复
1.
sql.Append(" and t_people.deptId in (@deptCodeInfo, '''') ");

2.
value="chujilingdao"

这样就行了,不要串那么多“点”,不要附加任何东西了,因为这个参数对于sp_executesql来说,是传入参数,是什么就传什么。
kevn 2010-10-14
  • 打赏
  • 举报
回复
第一段代码不是可以查到信息吗
wuguoxian001 2010-10-14
  • 打赏
  • 举报
回复
来学习了顶你们 高手们

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧