打印本文 打印本文 关闭窗口 关闭窗口
Dealing with identity gaps2
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1956  更新时间:2009/4/22 22:54:45  文章录入:mintao  责任编辑:mintao
; print "This is not a real identity gap"
        return (-1)
     end
  end /* if @p_gap_low > 0 */

  /*
   * determine the highest existing key value
   */
  select @gap_max = max(invoice_nr)
  from invoices

  if @@rowcount = 0 or @@error != 0
  begin
     print "Error occurred"
     return (-1)
  end
 
  /*
   * calculate new value for identity column in key table
   */
  if @p_gap_low > 0
  begin
     /* 
      * now update the application table to correct
      * the undesirable high key values
      */
     update invoices
     set invoice_nr = invoice_nr - @gap_size + 1
     where invoice_nr > @gap_low

     select @error = @@error, @rows = @@rowcount

     if @error != 0 or @rows = 0
     begin
        print "No rows updated or error occurred"
        return (-1)
     end

     /*
      * tell user what happened
      */
     print "%1! invoice numbers have been corrected.", @rows
     print "Invoice numbers starting from %1! have been reset to %2! and further.",
           @gap_high, @gap_low_plus_1

     /*
      * value to reset keytable with
      */
    select @set_new_idval = @gap_max - @gap_size + 1
  end
  else
  begin
     /*
      * case where keytable will be reset anyway
      */
     select @set_new_idval = @gap_max
  end

  /*
   * drop existing keytable; note that it's not necessary to
   * unpartition the table first (like in 11.0), although the
   * ASE documentation still says you can't drop a partitioned
   * table...
   */
  if object_id("invoices_keytable") != NULL
  begin
     -- commented out: this statement is not needed
     -- alter table invoices_keytable unpartition
     --

     drop table invoices_keytable
  end

  /*
   * now recreate the keytable. This can't be done in
   * the same procedure as where the table is dropped, so
   * this is done in a separate procedure
   */
  exec sp_create_invoices_keytable
 
  /*
   * switch identity_insert on for this table
   */
  set identity_insert invoices_keytable on

  insert invoices_keytable (dummy_key)
         values (@set_new_idval)

  set identity_insert invoices_keytable off

  /*
   * ready ...
   */
  return (0)
end
go
grant execute on sp_fix_idgap_invoices to public
go

/*
* end of file
*/

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口