Явное значение должно быть указано для столбца идентификаторов в таблице, когда для IDENTITY_INSERT установлено значение ON - PullRequest
0 голосов
/ 30 августа 2018

В моей базе данных есть таблицы с именами Table_Stories и Table_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]
Явное значение должно быть указано для столбца идентификаторов в таблице «Table_Stories», если для IDENTITY_INSERT задано значение ON или когда пользователь репликации вставляет в столбец идентификаторов NOT FOR REPLICATION.

Я не понимаю, что означает эта ошибка и как ее исправить.

p.s Я не могу вставить весь SQL-код здесь (не так, как я), он отнимает у меня слишком много времени из-за красной ошибки, которая отображается независимо от того, что я делаю, пытаясь исправить код вопроса.

1 Ответ

0 голосов
/ 30 августа 2018

Мои предложения:

  1. Переименуйте ID в UserID - это имя очень запутанно для таблицы UserStory
  2. Поместить все модификации данных в транзакцию
  3. Удалите лишнюю вторую вставку в Table_Stories - я не знаю, почему вы написали ее для
  4. Добавьте глагол в имя proc, сделайте что-то вроде EditUserStory или UserStory_UPD или что-то еще
  5. Укажите событие схемы объекта, если оно dbo, не используйте select *
* * 1 022, например,
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
...