CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

请教一个存储过程入参的写法

楼主nb_deng15()2006-06-01 11:52:58 在 .NET技术 / C# 提问

我要把页面上一个输入变换后传到存储过程中去,总发生错误,请大家帮我看一下  
  流程是:  
   
  1。得到用户输入变量lv_search,将它转化这个形式:  
  lv_where   =   "   WHERE     qq   LIKE   ''%''+''"+lv_search+"''+''%''   ";  
   
  2。把lv_where作为入参@where传到存储过程中去,其中使用@where的语句是:  
  SET   @SQLSTR2   =N'SELECT   TOP   5   *   '+@where+'   FROM       tableA   ORDER   BY   Aid         DESC'  
  exec   (@SQLSTR2)  
   
  现在我输入任意字符(如'test'),在程序中执行总报错:  
  第   1   行:   'test'   附近有语法错误。    
  说明:   执行当前   Web   请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。    
   
  异常详细信息:   System.Data.SqlClient.SqlException:   第   1   行:   'test'   附近有语法错误。  
   
  而取出lv_where在查询分析器中手动执行存储过程,却可以正确返回结果。lv_where一般是:where   flag=1   and   firsttouch   LIKE   ''%''+''test''+''%''    
   
  觉得很奇怪,变量应该是没有问题的,可程序执行老报错  
  请大家帮帮我,解决即送分,谢谢!  
  问题点数:100、回复次数:23Top

1 楼nb_deng15()回复于 2006-06-01 11:54:48 得分 0

更正一下,存储过程中使用变量的语句应该是  
  SET   @SQLSTR2   =N'SELECT   TOP   5   *     FROM       tableA     '+@where+'   ORDER   BY   Aid         DESC'  
  exec   (@SQLSTR2)  
   
  这个句子本来没有*,而是有十多个列名,为了大家看的方便编辑了一下~Top

2 楼kssys()回复于 2006-06-01 11:57:33 得分 2

楼主使用参数化即可解决问题。  
  即把所有程序传入SQL的变量,改为参数化。Top

3 楼nb_deng15()回复于 2006-06-01 11:59:58 得分 0

是,用参数化是很好  
  可是这个过程中可能是针对8个列的不同组合来查询,用参数化实在不知道该如何写  
  不得以才用了这种方式Top

4 楼dgrwang(探索者)回复于 2006-06-01 12:00:56 得分 2

markTop

5 楼bhwhy(苏秦)回复于 2006-06-01 12:26:17 得分 70

'test',如果你的变量本身就带',传入以后是firsttouch   LIKE   ''%text%''   ,还是判断替换吧。sql语句中常出现这种错误Top

6 楼nb_deng15()回复于 2006-06-01 12:33:57 得分 0

to   苏秦:  
  我试着把lv_search边的'去掉,写成这样:lv_where   =   "   WHERE     qq   LIKE   ''%''+''"+lv_search+"''+''%''   ";  
  结果报错成了:异常详细信息:   System.Data.SqlClient.SqlException:   列名   'asdfasdf'   无效。  
  另外您说的判断替换是什么意思啊?Top

7 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:34:41 得分 21

如果要传入参数要用sp_executesql  
  例如:  
  @SQL=select   @SQL=   'select   *   from   '+@TableName+   '     where     [Name]     like   ''%'+@Name   +'%'''   where   @Tag=3  
  exec   sp_executesql   @SQL,N'@PKID   int,@Name   varchar(80),@Remark   varchar(100),@ParentID   int,@status   int   ',@PKID,@Name,@Remark,@ParentID,@status  
  Top

8 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:36:11 得分 0

若你要用exec(@SQL)  
  那么你要这样写  
  SET   @SQLSTR2   =SELECT   TOP   5   *   FROM   tableA   '+@where+'   ORDER   BY   Aid   DESC  
  exec   (@SQLSTR2)Top

9 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:37:12 得分 0

提供我的一个管理字典表的存储过程:  
   
  ------------------------------------  
  --  
  --项目名称:OA  
  --说明:为表添加数据  
  --创建者:TengHua  
  --时间:2006年4月26日  
  --  
  --select   *   from   qu_Pivot  
  -------------------------------------  
  CREATE   PROCEDURE   sp_ModelSercharTypeSet   --sp_ModelSercharTypeSet     1,'te','34',23,0,'qu_Patent',1,3  
  @PKID   int=null,  
  @Name   varchar(80),  
  @Remark   varchar(100),    
  @ParentID   int=null,  
  @status   int,   --0在使用     1   停用  
  @TableName   varchar(30),--表名  
  @Type   int,   ---判定表类别,0--四个字段表,1---五个字段表  
  @Tag   int   --判定操作.0-表示添加,1-表修改,2-表删除,3-表查询  
   
  AS  
   
  declare   @SQL   nvarchar(3000)  
   
  if   @Type=1  
  begin  
  select     @SQL='insert   into     '+@TableName+'   (Name,Remark,ParentID,status)values(@Name,@Remark,@ParentID,@status)'   where   @Tag=0  
  select   @SQL='update   '+   @TableName+   '   set   [Name]=@Name,[Remark]=@Remark,[ParentID]=@ParentID,[status]=@status   where   [PKID]=@PKID'   where   @Tag=1  
  select     @SQL='delete   from   '+   @TableName   +'     where   PKID=@PKID'   where   @Tag=2  
  select   @SQL=   'select   *   from   '+@TableName+   '     where     [Name]   like   ''%'+@Name   +'%'''   where   @Tag=3  
  end  
   
  if   @Type=0  
  begin  
  select     @SQL='insert   into     '+@TableName+'   (Name,Remark,status)values(@Name,@Remark,@status)'   where   @Tag=0  
  select     @SQL='update   '+   @TableName+   '   set   [Name]=@Name,[Remark]=@Remark,[status]=@status   where   [PKID]=@PKID'   where   @Tag=1  
  select     @SQL='delete   from   '+   @TableName   +'   where   PKID=@PKID'   where   @Tag=2  
  select   @SQL=   'select   *   from   '+@TableName+   '     where     [Name]     like   ''%'+@Name   +'%'''   where   @Tag=3  
  end  
  --print   @SQL  
  --print   @name  
  exec   sp_executesql   @SQL,N'@PKID   int,@Name   varchar(80),@Remark   varchar(100),@ParentID   int,@status   int   ',@PKID,@Name,@Remark,@ParentID,@status  
       
   
   
   
   
   
  Top

10 楼bhwhy(苏秦)回复于 2006-06-01 12:43:58 得分 0

WHERE   ShipName   LIKE   '%e%'  
  %的'是不能去的如果有',把它变为'',replace替换下。楼上的把整个where传进去也是一种方法。Top

11 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:44:14 得分 0

where   flag=1   and   firsttouch   LIKE   ''%''+''test''+''%''    
  更正为  
  where   flag=1   and   firsttouch   LIKE   ''%'+@test+'%''    
   
  sql中''表示一个'Top

12 楼nb_deng15()回复于 2006-06-01 12:44:14 得分 0

to   naturalth:  
    谢谢您的回复,我查了一下sp_executesql   的用法,还不是很明白~  
    现在我的语句里有两个东西比较麻烦,让我不得不用拼个字符串再执行的方法:  
    1。查询是限定行数的,而这个行数也是个入参。我用的SQL   SERVER2000不支持直接写select   top   @rowcount~  
    2.条件列会根据用户的选择而变成在8个列的任意组合里查询,也就是说有时是where   id   like   '%'+@search='%',有时是where   id   like   '%'+@search='%'or   type   like   '%'+@search='%'  
    象这样也可以用sp_executesql吗?   如果可以,请教教偶怎么用~Top

13 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:44:23 得分 0

where   flag=1   and   firsttouch   LIKE   ''%''+''test''+''%''    
  更正为  
  where   flag=1   and   firsttouch   LIKE   ''%'+@test+'%''    
   
  sql中''表示一个'Top

14 楼bhwhy(苏秦)回复于 2006-06-01 12:45:02 得分 0

但是无论怎么样,在sql中遇到'你都要做处理.Top

15 楼nb_deng15()回复于 2006-06-01 12:53:14 得分 0

谢谢大家的回复,我在一个一个尝试  
  刚试过lv_where="where   title   LIKE   ''%'+"+lv_search+"+'%''   "  
  结果还是不行:异常详细信息:   System.Data.SqlClient.SqlException:   对数据类型而言运算符无效。运算符为   modulo,类型为   varchar。  
  Top

16 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:53:38 得分 0

sp_executesql动态生成sql语句,而你的条件就是的。用sp_executesql可以嵌入参数。用exec(@SQL)不可以  
  Top

17 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 12:57:13 得分 0

c#  
  lv_where=@"where   title   LIKE   ''%'"+lv_search+"'%''   "  
  Top

18 楼bhwhy(苏秦)回复于 2006-06-01 12:57:26 得分 0

lv_where="where   title   LIKE   '%"+lv_search+"%'"  
  重点处理lv_search,如果值是字符,把里面的'换成'',如果是数字,不动.  
  Top

19 楼xiahouwen(武眉博<活靶子.NET>)回复于 2006-06-01 13:13:39 得分 5

那你的sql就是  
  SELECT   TOP   5   *   WHERE     qq   LIKE     '%test%'   from   xxx...这样的了  
  语法检测都不过  
   
  where   语句放错地方了Top

20 楼nb_deng15()回复于 2006-06-01 13:16:26 得分 0

更正一下,存储过程中使用变量的语句应该是  
  SET   @SQLSTR2   =N'SELECT   TOP   5   *     FROM       tableA     '+@where+'   ORDER   BY   Aid         DESC'  
  exec   (@SQLSTR2)  
   
  这个句子本来没有*,而是有十多个列名,为了大家看的方便编辑了一下~,开始编辑错了~~~  
  Top

21 楼naturalth(自我批判,是思想、品德、素质、技能创新的优良工具)回复于 2006-06-01 13:23:33 得分 0

SET   @SQLSTR2   =SELECT   TOP   5   *   FROM   tableA   +@where+   ORDER   BY   Aid   DESC  
  exec   (@SQLSTR2)Top

22 楼nb_deng15()回复于 2006-06-01 13:39:52 得分 0

to   naturalth:  
  SET   @SQLSTR2   =SELECT   TOP   5   *   FROM   tableA   +@where+   ORDER   BY   Aid   DESC  
  exec   (@SQLSTR2)  
  这样写,存储过程就不能编译通过~~:在关键字   'SELECT'   附近有语法错误。Top

23 楼nb_deng15()回复于 2006-06-01 13:47:42 得分 0

谢谢大家,问题解决了  
  就是"   WHERE     msn   LIKE   '%"+tb_search.Text+"%'   ";  
  马上结帖  
  我的这个网站即将上线,域名是88.cctime.net  
  偶的QQ是171894267,希望大家继续支持!Top

相关问题

关键词

得分解答快速导航

  • 帖主:nb_deng15
  • kssys
  • dgrwang
  • bhwhy
  • naturalth
  • xiahouwen

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo