【问题标题】:Explicit value must be specified for identity column in table when IDENTITY_INSERT is set to ON当 IDENTITY_INSERT 设置为 ON 时,必须为表中的标识列指定显式值
【发布时间】:2018-08-31 01:46:14
【问题描述】:

我的数据库中有名为Table_StoriesTable_Images 的表,它们通过键连接。我使用我创建的存储过程将值插入其中。

CREATE TABLE [dbo].Table_Stories
(
    [StoryID] INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    [ID] INT FOREIGN KEY REFERENCES Table_Users(ID),
    [StoryText] NVARCHAR(120),
    [imgID] INT FOREIGN KEY REFERENCES Table_Images (imgID)
)

代码:

CREATE PROCEDURE UserStory  
    @ID [INT],
    @storyText [NVARCHAR](120),
    @img [VARCHAR](MAX)
AS
BEGIN
    DECLARE @StoryID INT, @ImageID INT;

    INSERT INTO Table_Images ([img]) VALUES (@img)

    SET @ImageID = SCOPE_IDENTITY();

    INSERT INTO Table_Stories ([ID], [StoryText], [imgID]) 
    VALUES (@ID, @storyText, @ImageID)

    SET @StoryID = SCOPE_IDENTITY();

    INSERT INTO Table_Stories ([StoryID]) 
    VALUES (@StoryID)

    INSERT INTO dbo.imagesInStories (StoryID, imgID)
    VALUES (@StoryID, @ImageID);

    SELECT * 
    FROM Table_Stories 
    WHERE StoryID = @StoryID AND imgID = @ImageID;
END

我跑:

exec UserStory 1, 'I welcom you to my trip', 'Chadmie.jpg'

并得到这个错误:

消息 545,级别 16,状态 1,过程 UserStory,第 14 行 [批处理开始行 291]
当 IDENTITY_INSERT 设置为 ON 或复制用户插入 NOT FOR REPLICATION 标识列时,必须为表“Table_Stories”中的标识列指定显式值。

我不明白这个错误是什么意思以及如何解决它。

附言 我无法在此处插入所有 sql 代码(不像我所做的那样),由于无论我尝试修复问题代码做什么,都会显示红色错误,这让我花费了太多时间。

【问题讨论】:

  • 看起来您已将 Table_Stories 的 IDENTITY_INSERT 设置为 ON。您可以通过将此设置为 Off 或在插入语句中包含 Identity 列来解决此问题。当它为 ON 时,您需要在 INSERT 语句中显式指定标识列的值。你可以阅读更多here
  • 显示 Table_Stories create table 脚​​本。我不理解其中的两个连续插入。
  • 感谢编辑它的人,我希望我知道如何并且不会在这个美妙的网站上造成麻烦。 @IvanStarostin - 我做到了。
  • @SaravanaKannadasanGandhi - 嗨,我不知道为什么,但是当我手动插入 [Table_Stories] 时,它处于关闭状态,必须先编写此代码:SET IDENTITY_INSERT [dbo].[Table_Stories] ON GO .所以现在我不明白你发给我的页面该怎么做。
  • 您需要 SET IDENTITY_INSERT [dbo].[Table_Stories] ON 每当您想为您的身份列 (StoryID) 手动插入一个值时......乐于助人!

标签: sql-server tsql stored-procedures syntax-error


【解决方案1】:

我的建议:

  1. ID 重命名为UserID - 对于表UserStory,它的名称现在非常混乱
  2. 将所有数据修改放入事务中
  3. 删除多余的第二次插入到Table_Stories - 我不知道你为什么写它
  4. 在 proc 的名称中添加一些动词,使其类似于 EditUserStoryUserStory_UPD 或其他任何内容
  5. 如果是dbo,请指定对象的架构事件,不要使用select *

例如

CREATE PROCEDURE dbo.UserStory_UPD
    @UserID INT,
    @storyText NVARCHAR(120),
    @img VARCHAR(MAX) -- I assume this is a path or an URL
AS
BEGIN
    DECLARE @StoryID INT, @ImageID INT;

    BEGIN TRY
      /* params validation stuff */

      BEGIN TRAN

      INSERT INTO dbo.Table_Images ([img]) 
      VALUES (@img)

      SET @ImageID = SCOPE_IDENTITY();

      INSERT INTO dbo.Table_Stories ([UserID], [StoryText], [imgID]) 
      VALUES (@UserID, @storyText, @ImageID)

      SET @StoryID = SCOPE_IDENTITY();

      INSERT INTO dbo.imagesInStories (StoryID, imgID)
      VALUES (@StoryID, @ImageID);

      COMMIT TRAN
    END TRY
    BEGIN CATCH
      IF @@TRANCOUNT > 0
        ROLLBACK TRAN
      /* raiserror stuff or THROW */
    END CATCH

    SELECT s.StoryID, s.UserID, s.StoryText, s.ImgID
    FROM dbo.Table_Stories s
    WHERE s.StoryID = @StoryID
END

【讨论】:

  • ,我做了并且我理解了除了最后一部分之外的所有内容(我选择不使用): COMMIT TRAN END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRAN /* raiserror stuff or THROW */ END CATCH
猜你喜欢
  • 2016-10-21
  • 2019-03-10
  • 2011-05-13
  • 2016-05-13
  • 2018-06-29
  • 1970-01-01
  • 2016-08-18
相关资源
最近更新 更多