日期:2014-05-19  浏览次数:20410 次

一个存储过程引发的错误,急!帮忙看一下
CREATE   procedure   [dbo].[build_mail]   @gsid   bigint,@mname   varchar(100),@topic   varchar(250),@msg   varchar(100),@sql   ntext
as
declare   @id   int
begin   tran
select   @id=isnull(max(id),0)   from   mission
set   @id=@id+1
insert   into   mission(accid,missionname,title,[message],sort)   values(@gsid,@mname,@topic,@msg, 'mail ')
exec( 'insert   into   mission_list(misid,target)   select   '+@id+ ',*   from   ( '+@sql+ ')   aa ')
commit   tran
以上是存储过程,传递4个参数,最后一个是SQL语句,下面是执行过程:
build_mail   580, '580_mail_20074325 ', '23423 ', '369 ',SELECT   userlist.Email   FROM   userlist   INNER   JOIN   qyml   ON   Qyml.ID   =   userlist.gsid   where   (   (qyml.sf= '广东 '   and   qyml.city   = '广州 '))   and   ((   qyml.hylb   like '%贸易型-板材类-热轧板卷% '))   group   by   userlist.email    

在查询分析器检查,出现一下错误:
消息   103,级别   15,状态   4,第   1   行
以   'SELECT   userlist.Email   FROM   userlist   INNER   JOIN   qyml   ON   Qyml.ID   =   userlist.gsid   where   (   (qyml.sf= '广东 '   and   qyml.city   = '广州 '))   and   ( '   开头的   标识符   太长。最大长度为   128。

还有就是sql语句有 " ' "符号,怎么处理才能不出错?


------解决方案--------------------
两个单引号代表一个单引号
------解决方案--------------------
build_mail 580, '580_mail_20074325 ', '23423 ', '369 ',SELECT userlist.Email FROM userlist INNER JOIN qyml ON Qyml.ID = userlist.gsid where ( (qyml.sf= '广东 ' and qyml.city = '广州 ')) and (( qyml.hylb like '%贸易型-板材类-热轧板卷% ')) group by userlist.email

改為

EXEC build_mail 580, '580_mail_20074325 ', '23423 ', '369 ', 'SELECT userlist.Email FROM userlist INNER JOIN qyml ON Qyml.ID = userlist.gsid where ( (qyml.sf= ' '广东 ' ' and qyml.city = ' '广州 ' ')) and (( qyml.hylb like ' '%贸易型-板材类-热轧板卷% ' ')) group by userlist.email '
------解决方案--------------------
1.@sql ntext===> @sql varchar(8000)
2. 'insert into mission_list(misid,target) select '+@id+ ',* from ( '+@sql+ ') aa '
===> 'insert into mission_list(misid,target) select '+ltrim(@id)+ ',* from ( '+@sql+ ') aa '
3.同上