我有如下存储过程CREATE PROCEDURE  SetUsersState
@u_state [tinyint],
@uID [varchar](2000)
 AS
if @uID = '' return
declare @sql  varchar(4000)
set @sql = 'update users set u_state =' +@u_state +  '  where u_ID in(''' +@uID +''')'  
exec(@sql)
GO执行exec SetUsersState 1,'11,12'时提示如下错误
服务器: 消息 245,级别 16,状态 1,过程 SetUsersState,行 9
将 varchar 值 'update users set u_state =' 转换为数据类型为 tinyint 的列时发生语法错误。

解决方案 »

  1.   

    CREATE PROCEDURE  SetUsersState
    @u_state [tinyint],
    @uID [varchar](2000)
    AS
    if @uID = '' 
    return
    declare @sql  varchar(4000)
    set @sql = 'update users set u_state =' +rtrim(@u_state) +  '  where u_ID in(''' +@uID +''')' --加上rtrim
    exec(@sql)
      

  2.   

    CREATE PROCEDURE  SetUsersState
    @u_state [tinyint],
    @uID [varchar](2000)
    AS
    if @uID = '' 
    return
    exec( 'update users set u_state =' +@u_state +  '  where u_ID in(''' +@uID +''')')GO
      

  3.   

    set @sql = 'update users set u_state =' +ltrim(@u_state)+ '  where u_ID in(' +@uID +')'  
      

  4.   

    exec( 'update users set u_state =' +@u_state +  '  where u_ID in(' +@uID +')')--整數時,去掉''引號
      

  5.   

    1,make sure the type of u_state is tinyint, or
    2,define the type of @u_state as same as users.u_state, and
    3,change '  where u_ID in(' +@uID +')' as ' where u_ID in(''' +@uID +''')'  
      

  6.   

    Sorry, 3 items are mistakes.Modify according below:set @sql = 'update users set u_state =' +@u_state +  '  where u_ID in(''' +@uID +''')'  ==>set @sql = 'update users set u_state =' +convert(varchar,@u_state) +  '  where u_ID in(''' +@uID +''')'  or 
    set @sql = 'update users set u_state =' +cast(@u_state as varchar) +  '  where u_ID in(''' +@uID +''')'  
      

  7.   

    谢谢 roy_88 和下面的cuckoo1 ,问题已经解决,说白了还是自己不了解除武装SQL呀,用Ltrim或是Rtrim同样报错,直接exec就可以了,没有报错了.CREATE PROCEDURE  SetUsersState
    @u_state [tinyint],
    @uID [varchar](2000)
     AS
    if @uID = '' 
      return
    exec( 'update users set u_state =' +@u_state +  '  where u_ID in(' +@uID +')')
    GO
      

  8.   

    很诡异,把sql语句直接放在exec()的括号里面就行,保存在一个变量@sql,再exec(@sql)就不行!!