帮忙看一下下面的问题该怎么处理
if exists(select name from sysobjects where name='book_add')
drop proc book_add
go
create proc book_add
(@isbn char(16),@书名 char(26),@作者 char(8),@出版社 char(20),@价格 float,@库存量 int)
as
begin
insert into book values(@isbn,@书名,@作者,@出版社,@价格,@库存量)
end
go
exec book_add '1000','会计原理','张名','北京邮电出版社',21.5,4运行时错误提示:服务器: 消息 8101,级别 16,状态 1,过程 book_add,行 5
仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'book' 中为标识列指定显式值。
服务器: 消息 2812,级别 16,状态 62,行 1
未能找到存储过程 'book_add'。

解决方案 »

  1.   

    --1. 会话中某个表已将此属性设置为ON,当为另一个表发出了SET IDENTITY_INSERT ON 句时将出错
    --测试的表
    CREATE TABLE ta(id int IDENTITY(1,1),col int)
    CREATE TABLE tb(id int IDENTITY(1,1),col int)
    GO--设置 IDENTITY_INSERT 属性
    SET IDENTITY_INSERT ta ON
    SET IDENTITY_INSERT tb ON
    GO
    /*======================================================*/
    --2. 如果插入记录的标识值大于表的当前标识值,则SQL Server自动将新插入值作为当前标识值使用
    --测试的表
    CREATE TABLE tb(id int IDENTITY(1,1),col int)--强制在表中插入标识值
    SET IDENTITY_INSERT tb ON
    INSERT tb(id,col) VALUES(10,1)
    SET IDENTITY_INSERT tb OFFINSERT tb(col) VALUES(2)
    SELECT * FROM tb
    /*--结果
    id           col 
    ----------------- ----------- 
    10          1
    11          2
    --*/
    GO
    /*======================================================*/
    --3. 如果插入记录的标识值小于表的当前标识值,则表的当前标识值不受新插入值的影响
    --测试的表
    CREATE TABLE tb(id int IDENTITY(1,1),col int)
    INSERT tb VALUES(1)
    INSERT tb VALUES(2)--强制在表中插入标识值
    SET IDENTITY_INSERT tb ON
    INSERT tb(id,col) VALUES(1,11)
    SET IDENTITY_INSERT tb OFFINSERT tb(col) VALUES(3)
    SELECT * FROM tb
    /*--结果
    id           col 
    ----------------- ----------- 
    1           1
    2           2
    1           11
    3           3
    --*/
      

  2.   

    if exists(select name from sysobjects where name='book_add')
    drop proc book_add
    go
    create proc book_add
    (@isbn char(16),@书名 char(26),@作者 char(8),@出版社 char(20),@价格 float,@库存量 int)
    as
    begin
    set identity_insert book on
    insert into book values(@isbn,@书名,@作者,@出版社,@价格,@库存量)
    set identity_insert book off
    end
    go
    exec book_add '1000','会计原理','张名','北京邮电出版社',21.5,4
      

  3.   

    set IDENTITY_INSERT book on
    insert into.....
    set IDENTITY_INSERT book off
      

  4.   

    不要对有identity标识的列..显式插入值..如果要这样做..
    请使用Set IDENTITY_INSERT tb_name ON
      

  5.   

    insert into book(col1,col2....) values(@isbn,@书名,@作者,@出版社,@价格,@库存量) 
      

  6.   

    或者干脆别插入identity列的值,或者将identity列改掉
      

  7.   

    @isbn对应的列是自增列,不用插入,SQL自动生成,要显式插入,必须 set identity_insert book on
      

  8.   

    服务器: 消息 8101,级别 16,状态 1,过程 book_add,行 5 
    仅当使用了列的列表,并且 IDENTITY_INSERT 为 ON 时,才能在表 'book' 中为标识列指定显式值这个错误是因为你的 book表中有标识列,不允许手动添加
    服务器: 消息 2812,级别 16,状态 62,行 1 
    未能找到存储过程 'book_add'
    这是因为你的存储过程没有建成功