使用max +1为单个记录插入数据而不是表

时间:2016-08-25 06:19:43

标签: mysql sql sql-server

我需要根据2个参数更新一行。到目前为止,我的查询将在处理表时使用MAX来处理相关字段。 我很难将字段限制在所需的记录中。参数是@ClientCode和@BillSeq以选择正确的记录

这是适用于表

的查询
DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)
SELECT 
                @ClientCode = '00NJ'
                ,@BillSeq = 1
                ,@BillCommentSeq = (select MAX(BillCommentSeq) +1 from billcomment )
                ,@Billcomment =  (Select convert (varchar,getdate (),10) +' '+ 'Re-invoiced bill adjusting fees to 0' )


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, @BillCommentSeq, '' , @Billcomment)

我希望下面的查询可以正常工作,但不是

DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)
SELECT 
                @ClientCode = '00NJ'
                ,@BillSeq = 1
                ,@BillCommentSeq = (select MAX(BillCommentSeq) +1 from billcomment where clientcode = @ClientCode and billseq = @BillSeq )
                ,@Billcomment =  (Select convert (varchar,getdate (),10) +' '+ 'Re-invoiced bill adjusting fees to 0' )


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, @BillCommentSeq, '' , @Billcomment)

我收到此错误:

  

无法将值NULL插入列“BillCommentSeq”表中   'database.dbo.BillComment';列不允许空值。 INSERT失败。   声明已经终止。

使用此修改后的声明

DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)
SELECT 
                @ClientCode = '00NJ'
                ,@BillSeq = 1
                ,@BillCommentSeq = (select MAX(BillCommentSeq)  from billcomment) +1 where clientcode = @ClientCode and billseq = @BillSeq )
                ,@Billcomment =  (Select convert (varchar,getdate (),10) +' '+ 'Re-invoiced bill adjusting fees to 0' )


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, @BillCommentSeq, '' , @Billcomment)

错误是这样的:

  

关键字'where'附近的语法不正确。

5 个答案:

答案 0 :(得分:0)

Billcomment表是否已有记录?如果不匹配,或者如果没有匹配where子句,则Max()将返回NULL。用isnull()包装语句(不确定MySql中是否存在该语句,否则我确定它在MySql中有对应的语句。

对于不正确的语法错误,这基本上是查询:

(select MAX(BillCommentSeq)  from billcomment) +1 
  where clientcode = @ClientCode and billseq = @BillSeq )

请注意from billcomment后初始左大括号是如何关闭的。其余的语句+1 where .... (select MAX(BillCommentSeq) from billcomment)部分,因此语法无效。

在+1之前移除),这应该消除无效的语法错误。

答案 1 :(得分:0)

DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)
SELECT 
            @ClientCode = '00NJ'
            ,@BillSeq = 1
            ,@BillCommentSeq = (select MAX(BillCommentSeq) +1 from billcomment where clientcode = @ClientCode and billseq = @BillSeq )
            ,@Billcomment =  (Select convert (varchar,getdate (),10) +' '+ 'Re-invoiced bill adjusting fees to 0' )


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, IFNULL( @BillCommentSeq,0), '' , @Billcomment)

答案 2 :(得分:0)

        DECLARE @ClientCode char(4), 
                @BillSeq int, 
                @BillCommentSeq smallint, 
                @Billcomment varchar(7500)

       Set      @ClientCode = '00NJ'
       Set      @BillSeq = 1

      SELECT @BillCommentSeq=Max(BillCommentSeq) 
      FROM billcomment 
      where clientcode = @ClientCode and billseq = @BillSeq

       IF @BillCommentSeq Is NUll 
           SET @BillCommentSeq=1
       Else 
           Select @BillCommentSeq = Max(BillCommentSeq) + 1 
           FROM   billcomment 
           where  clientcode = @ClientCode 
                  and billseq = @BillSeq 

          Select   @Billcomment =  (Select convert (varchar,getdate (),10) + 'Re-     invoiced bill adjusting fees to 0' )
          Print @Billcomment

           INSERT into BillComment
           Select @ClientCode,@BillSeq,@BillCommentSeq,@Billcomment

          Select * from BillComment

答案 3 :(得分:0)

所有查询都是设置操作,因此它们不是顺序操作。您在其中设置最大+1值的选项可能无法“了解”@ClientCode@BillSeq值。尝试将SELECT拆分为两个:

DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)

SELECT @ClientCode = '00NJ',
       @BillSeq = 1

SELECT @BillCommentSeq = (select max(BillCommentSeq)+1 from billcomment where clientcode = @ClientCode and billseq = @BillSeq),
       @Billcomment = (select convert(varchar, getdate(), 10) +' '+ 'Re-invoiced bill adjusting fees to 0' )


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, @BillCommentSeq, '' , @Billcomment)

答案 4 :(得分:0)

尝试使用以下代码。

DECLARE @ClientCode char(4), @BillSeq int, @BillCommentSeq smallint, @Billcomment varchar(7500)
SET  @ClientCode = '00NJ'
SET  @BillSeq = 1

SELECT @BillCommentSeq = MAX(ISNULL(BillCommentSeq,0)) +1 from billcomment 
 WHERE clientcode = @ClientCode and billseq = @BillSeq 
                ,
SELECT @Billcomment = convert (varchar,getdate (),10) +' '+ 'Re-invoiced bill adjusting fees to 0' 


INSERT into dbo.BillComment VALUES (@ClientCode, @BillSeq, @BillCommentSeq, '' , @Billcomment)