go 
create proc create_UserSysLog
 @UsersysLog_Uid nvarchar(128)=null
,@UsersysLog_Action   nvarchar(200)=null
,@UsersysLog_Operate  nvarchar(500)=null
,@begdt nvarchar(50)  --开始时间
,@enddt nvarchar(50)  --结束时间
,@UsersysLog_DateTime nvarchar(50)=null --时间字段
 
as 
declare @error int --Rec Message
set @error=0;begin transaction 
select * from dbo.T_UsersysLog
where 
case when @begdt  is not null then --选择开始和结束字段(此行报错)
UsersysLog_DateTime between @enddt and @begdt and  (此行报错)
else UsersysLog_DateTime<@enddt end and --只选择结束字段
UsersysLog_Uid like case when @UsersysLog_Uid is null then UsersysLog_Uid 
else @UsersysLog_Uid end  and
UsersysLog_Action like case when @UsersysLog_Action  is null then UsersysLog_Uid 
else @UsersysLog_Uid end  and
UsersysLog_Operate like case when @UsersysLog_Operate is null then UsersysLog_Operate
else @UsersysLog_Operate end set @error=@error+@@ERROR
if @error>0
begin 
  rollback transaction 
end
else 
   begin
  commit transaction   
   end1. 156,级别 15,状态 1,过程 create_UserSysLog,第 17 行
关键字 'between' 附近有语法错误。
2.关于间隔时间的查询:UsersysLog_DateTime between @enddt and @begdt
存储SQLselect

解决方案 »

  1.   

    UsersysLog_DateTime between @enddt and @begdt and  (此行报错)
    把最后这个and去掉
      

  2.   

    你要对比的两年变量都不是日期而是nvarchar(50),需要用datetime或smalldatetime才行吧
      

  3.   

    Q1:UsersysLog_DateTime between @enddt and @begdt and  (此行报错)
     把最后这个and去掉 
    Ans:老师我把and 去掉了,还是报同样的错
      

  4.   

    create proc create_UserSysLog
     @UsersysLog_Uid nvarchar(128)=null
    ,@UsersysLog_Action   nvarchar(200)=null
    ,@UsersysLog_Operate  nvarchar(500)=null
    ,@begdt nvarchar(50)  --开始时间
    ,@enddt nvarchar(50)  --结束时间
    ,@UsersysLog_DateTime nvarchar(50)=null --时间字段
     
    as select * from dbo.T_UsersysLog
    where 1=1 
    case when @begdt is not null then
     AND UsersysLog_DateTime between @enddt and @begdt
    else UsersysLog_DateTime<@enddt end
     AND UsersysLog_Uid like case when @UsersysLog_Uid is null then UsersysLog_Uid 
    else @UsersysLog_Uid end
     AND UsersysLog_Action like 
       case when @UsersysLog_Action  is null then 
         UsersysLog_Uid 
       else
         @UsersysLog_Uid 
       end
     AND UsersysLog_Operate like 
       case when @UsersysLog_Operate is null then 
          UsersysLog_Operate
       else 
          @UsersysLog_Operate 
       end 
    你试试这样写行不行。不行的话,可以在存储过程里面拼语句:
    declare @SQL varchar(8000);然后根据条件来拼接语句就可以了。
      

  5.   

    我怎么看怎么觉得你这条件语句(where)后面都不对劲。你试试把你现在出错的语句注释,看后面的条件是否正确,因为我看你这个where语句貌似错的
      

  6.   

    我怎么看怎么觉得你这条件语句(where)后面都不对劲。你试试把你现在出错的语句注释,看后面的条件是否正确,因为我看你这个where语句貌似错的给你一个where后面接case when的例子,你自己改下
    select * from tables
    where ShipQuantity=(case when ShipQuantity>1 then 2 else 3 end)
      

  7.   

    虽然时间字符串完全一样可以实现比较,但是可靠性和性能远不如datetime了
    一般是where中尽量用字段的原始类型(不会破坏索引),select字段中才格式化成需要的样式