请教一个存储过程入参的写法
我要把页面上一个输入变换后传到存储过程中去,总发生错误,请大家帮我看一下
流程是:
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




