想要将值插入到自动编号(或者说是标识列,
      
       IDENTITY
      
      
       )中去,需要设定
      
      
       SET
       
       IDENTITY_INSERT
      
     
    
     
      示例:
     
    
     
      1.
      
       首先建立一个有标识列的表:
      
     
     
     
      CREATE
      
      TABLE
      
      products
      
      (id
      
      int
      
      IDENTITY
      
      PRIMARY
      
      KEY,
      
      product
      
      varchar(40))
     
    
     
      2.
      
       尝试在表中做以下操作:
      
     
     
     
      INSERT
      
      INTO
      
      products
      
      (id,
      
      product)
      
      VALUES(3,
      
      ‘garden
      
      shovel’)
     
    
     
      结果会导致错误:
      
       “
      
      
       当
       
      
      
       IDENTITY_INSERT
       
      
      
       设置为
       
      
      
       OFF
       
      
      
       时,不能向表
       
      
      
       ‘products’
       
      
      
       中的标识列插入显式值。
      
      
       ”
      
     
    
     
      3.
      
       改用:
      
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products
      
      ON
     
     
     
      INSERT
      
      INTO
      
      products
      
      (id,
      
      product)
      
      VALUES(1,
      
      ‘garden
      
      shovel’)
     
    
     
      返回正确。
     
    
     
      4.
      
       建立另外一个表
      
      
       products2
      
      
       ,尝试相同插入操作:
      
     
     
     
      CREATE
      
      TABLE
      
      products2
      
      (id
      
      int
      
      IDENTITY
      
      PRIMARY
      
      KEY,
      
      product
      
      varchar(40))
     
    
     
      然后执行:
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products2
      
      ON
     
     
     
      INSERT
      
      INTO
      
      products2
      
      (id,
      
      product)
      
      VALUES(1,
      
      ‘garden
      
      shovel’)
     
    
     
      导致错误:
      
       “
      
      
       表
       
      
      
       ‘material.dbo.products’
       
      
      
       的
       
      
      
       IDENTITY_INSERT
       
      
      
       已经为
       
      
      
       ON
      
      
       。无法对表
       
      
      
       ‘products2’
       
      
      
       执行
       
      
      
       SET
       
      
      
       操作。
      
      
       ”
      
     
    
     
      改为执行:
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products
      
      OFF
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products2
      
      ON
     
     
     
      INSERT
      
      INTO
      
      products2
      
      (id,
      
      product)
      
      VALUES(2,
      
      ‘garden
      
      shovel’)
     
    
     
      执行通过。
     
    
     
      5.
      
       尝试以下操作:
      
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products2
      
      ON
     
     
     
      INSERT
      
      INTO
      
      products2
      
      SELECT
      
      *
      
      FROM
      
      products
     
    
     
      导致错误:
      
       “
      
      
       仅当使用了列的列表,并且
       
      
      
       IDENTITY_INSERT
       
      
      
       为
       
      
      
       ON
       
      
      
       时,才能在表
       
      
      
       ‘products2’
       
      
      
       中为标识列指定显式值。
      
      
       ”
      
     
    
     
      6.
      
       改为:
      
     
     
     
      SET
      
      IDENTITY_INSERT
      
      products2
      
      ON
     
     
     
      INSERT
      
      INTO
      
      products2
      
      (id,
      
      product)
      
      SELECT
      
      *
      
      FROM
      
      products
     
    
     
      执行通过。
     
    
     
      总结:
     
    
     
      1.
      
       每一次连接会话中的任一时刻,只能对一个表设置
      
      
       IDENTITY_INSERT
       
       ON
      
      
       ,且设置只对当前会话有效;
      
     
     
     
      2.
      
       在对标识列执行插入操作进,一定要列出此标识列(当然,同时也就需要列出相关的其他列了)。
      
     
    
     
      附:
     
     
     
      SQL
      
       Server
      
      
       帮助文档相关内容
      
     
    
     
      SET
      
      IDENTITY_INSERT
     
     
     
      
      允许将显式值插入表的标识列中。
     
    
     
      语法
     
     
     
      SET
      
      IDENTITY_INSERT
      
      [
      
      database
      
      .
      
      [
      
      owner
      
      .
      
      ]
      
      ]
      
      {
      
      table
      
      }
      
      {
      
      ON
      
      |
      
      OFF
      
      }
     
    
     
      参数
     
     
     
      database
     
    
     
      是表所有者的名称。
     
    
     
      table
     
    
     
      如果插入值大于表的当前标识值,则
      
      
       SQL
       
       Server
       
      
      
       自动将新插入值作为当前标识值使用。
      
     
    
     
      SET
      
      IDENTITY_INSERT
      
      
       的设置是在执行或运行时设置,而不是在分析时设置。
      
     
    
     
      权限
     
     
     
      执行权限默认授予
      
      
       sysadmin
       
      
      
       固定服务器角色和
       
      
      
       db_owner
       
      
      
       及
       
      
      
       db_ddladmin
       
      
      
       固定数据库角色以及对象所有者。
      
     
    
     
      示例
     
     
     
      下例创建一个含有标识列的表,并显示如何使用
      
      
       SET
       
       IDENTITY_INSERT
       
      
      
       设置填充由
       
      
      
       DELETE
       
      
      
       语句导致的标识值中的空隙。
      
     
    
     
      —
      
      Create
      
      products
      
      table.CREATE
      
      TABLE
      
      products
      
      (id
      
      int
      
      IDENTITY
      
      PRIMARY
      
      KEY,
      
      product
      
      varchar(40))GO–
      
      Inserting
      
      values
      
      into
      
      products
      
      table.INSERT
      
      INTO
      
      products
      
      (product)
      
      VALUES
      
      (‘screwdriver’)INSERT
      
      INTO
      
      products
      
      (product)
      
      VALUES
      
      (‘hammer’)INSERT
      
      INTO
      
      products
      
      (product)
      
      VALUES
      
      (‘saw’)INSERT
      
      INTO
      
      products
      
      (product)
      
      VALUES
      
      (‘shovel’)GO–
      
      Create
      
      a
      
      gap
      
      in
      
      the
      
      identity
      
      values.DELETE
      
      products
      
      WHERE
      
      product
      
      =
      
      ‘saw’GOSELECT
      
      *
      
      FROM
      
      productsGO–
      
      Attempt
      
      to
      
      insert
      
      an
      
      explicit
      
      ID
      
      value
      
      of
      
      3;–
      
      should
      
      return
      
      a
      
      warning.INSERT
      
      INTO
      
      products
      
      (id,
      
      product)
      
      VALUES(3,
      
      ‘garden
      
      shovel’)GO–
      
      SET
      
      IDENTITY_INSERT
      
      to
      
      ON.SET
      
      IDENTITY_INSERT
      
      products
      
      ONGO–
      
      Attempt
      
      to
      
      insert
      
      an
      
      explicit
      
      ID
      
      value
      
      of
      
      3INSERT
      
      INTO
      
      products
      
      (id,
      
      product)
      
      VALUES(3,
      
      ‘garden
      
      shovel’).GOSELECT
      
      *
      
      FROM
      
      productsGO–
      
      Drop
      
      products
      
      table.DROP
      
      TABLE
      
      productsGO
     
    
     
      总结:
     
    
     
      1.
      
       每一次连接会话中的任一时刻,只能对一个表设置
      
      
       IDENTITY_INSERT
       
       ON
      
      
       ,且设置只对当前会话有效;
      
     
     
     
      2.
      
       在对标识列执行插入操作进,一定要列出此标识列(当然,同时也就需要列出相关的其他列了)。
      
     
    
 
