Member 12857356 Ответов: 2

Явная ошибка в sqlserver


Привет , у меня есть хранимая процедура для вставки данных из c#.Когда я создаю хранимую процедуру, она выдает ошибку.Ошибка приведена ниже

Явное значение столбца identity в таблице 'tbl_seat' может быть задано только в том случае, если используется список столбцов и включен параметр IDENTITY_INSERT.


create procedure sp_insert_seat
@A1 varchar(5),@A2 varchar(5),@A3 varchar(5),@A4 varchar(5),@A5 varchar(5),@A6 varchar(5),@A7 varchar(5),@A8 varchar(5),@A9 varchar(5),@A10 varchar(5),@A11 varchar(5),@A12 varchar(5),@A13 varchar(5),@A14 varchar(5),@A15 varchar(5),@A16 varchar(5),@A17 varchar(5),@A18 varchar(5),@A19 varchar(5),@A20 varchar(5),
@S1 varchar(5),@S2 varchar(5),@S3 varchar(5),@S4 varchar(5),@S5 varchar(5),@S6 varchar(5),@S7 varchar(5),@S8 varchar(5),@S9 varchar(5),@S10 varchar(5),@S11 varchar(5),@S12 varchar(5),@S13 varchar(5),@S14 varchar(5),@S15 varchar(5),@S16 varchar(5),@S17 varchar(5),@S18 varchar(5),@S19 varchar(5),@S20 varchar(5),
@id int
as
begin
insert into tbl_seat values(@id,@A1,@A2,@A3,@A4,@A5 ,@A6 ,@A7 ,@A8 ,@A9 ,@A10 ,@A11 ,@A12 ,@A13,@A14 ,@A15 ,@A16 ,@A17 ,@A18 ,@A19 ,@A20,
@S1,@S2,@S3 ,@S4 ,@S5 ,@S6 ,@S7 ,@S8 ,@S9 ,@S10 ,@S11 ,@S12 ,@S13 ,@S14 ,@S15 ,@S16 ,@S17 ,@S18 ,@S19 ,@S20)

end


Что я уже пробовал:

Я попробовал " установить Identiy_insert tbl_name ON"

Я пробую этот метод, но и он выдает ошибку .

Andy Lanng

Если столбец id является столбцом identity, то зачем вы вставляете идентификатор?

Member 12857356

Нет, это еще один идентификатор, который я получаю от другого стола.

Andy Lanng

Ах, то, что вы делаете выше, будет вставлено в первый столбец, если вы не укажете столбцы
вставить в tbl_seat(col_id, col_2, col3, ...)
значения (@е.@А1,@А2 ...)

Member 12857356

Нет первый столбец является столбцом идентификаторов

Member 12857356

спасибо вы получили ответ

2 Ответов

Рейтинг:
2

Wendelius

Я знаю, что вы уже решили эту проблему, но, глядя на процедуру и определение таблицы, я не могу не задаться вопросом, достаточен ли уровень нормализации или нет...

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

Примером может служить хранение каждого бронирования в отдельной строке, например:

seat_reservation
- id (pointing to another, parent table)
- seatno (value between 1 and 20)
- reservation (the current parameter value if needed)

Теперь, если места 1, 4, 5 и 17 зарезервированы, таблица будет содержать только эти четыре ряда.

Такой дизайн позволил бы легко исследовать, какие места зарезервированы/свободны, вносить изменения в количество мест, реализовывать логику резервирования без процедурного программирования и так далее, опять же учитывая, что я правильно интерпретировал ситуацию...


Maciej Los

5ед!

Wendelius

Спасибо.

Рейтинг:
12

OriginalGriff

Столбцы идентификаторов управляются SQL Server, и обычно вы вообще не должны писать в них - это противоречит цели столбца идентификаторов, которая заключается в том, чтобы гарантировать уникальность всех значений. Хотя вы можете сделать это для некоторых случайных и исключительных задач (таких как удаление пробелов после того, как БД была вставлена и удалена в течение длительного времени), даже я бы не рекомендовал это делать - это должно быть рассмотрено очень, очень тщательно, поскольку столбцы идентификаторов часто используются в качестве столбцов идентификаторов строк и ссылаются через внешние ключи из других таблиц. Просто изменение столбцов идентификаторов может очень легко связать неправильную информацию со строкой.

Если @ID - это значение для столбца идентификаторов, то вы получаете его откуда - то-и есть вероятность, что вы "предварительно выделили" значение, получив максимальное существующее и добавив его. Это опасно-потому что слишком легко заставить двух разных пользователей предварительно выделить одно и то же значение, и тогда ваша база данных полностью выйдет из строя.
Не делай этого. Используйте столбец идентификаторов, никогда не записывайте в него и извлеките идентификационный номер обратно, как только вы вставили строку с помощью SCOPE_IDENTITY() функция.

И сделай себе два одолжения:
1) всегда перечисляйте столбцы, в которые вы вставляете:

INSERT INTO MyTable (MyColumn1, MyColumn2) VALUES (@MyValueForColumn1, @MyValueForCoumn2)
Если вы этого не сделаете, то либо ваш код ломается при добавлении или удалении столбцов, либо, что еще хуже, ваша база данных получает информацию в неправильных столбцах.
2) Используйте разумные имена! A1 - A15, S1-S20 не описывают того, что они делают, и это делает обслуживание намного сложнее позже.


Maciej Los

5ед!