Добавьте учеников в таблицу с хранимыми процедурами и проверьте, является ли параметр ложным или нет - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть Student таблица, подобная этой

CREATE TABLE Students (
  studentID int,
  firstname varchar(100),
  lastname varchar(100),
  gender varchar(6),
  streetAdress varchar(100),
  zipcode int,
  city varchar(100),
  country varchar(100),
  birthdate varchar(100),
  studentType varchar(100),
  primary key (studentID)
);

insert into Students values(5341,'Erik','Han','Man','Alléstigen 13',1223,'District 13','France','1945-01-06','Program');

Теперь я знаю, что вы можете вставить ее следующим образом, но как мне это сделать с помощью хранимых процедур, где входные данные для процедуры studentID , firstname, lastname, gender, streetAdress, zipcode, city, country, birthdate и studentType. Другое дело, могу ли я сделать так, чтобы он проверял, являются ли введенные данные ложными или пользователь уже существует, и если что-либо из этого является истинным, он должен завершиться без добавления чего-либо.

CREATE PROCEDURE AddStudents  @studentID, @firstname, @lastname, @gender, @streetAdress,
@zipcode, @city, @country, @birthdate, @studentType   
...     
GO;

Должен ли я просто положить

insert into Students values (@studentID, @firstname, @lastname, @gender, @streetAdress,
    @zipcode, @city, @country, @birthdate, @studentType)

Внутри процедуры и затем получить

EXEC AddStudents @studentID = 5341, @firstname = 'Erik', @lastname = 'Han', @gender = 'Man', @streetAdress = 'Alléstigen 13', @zipcode = 1223, @city = 'District 13', @country = 'France', @birthdate = '1945-01-06', @birthdate = 'Program';

1 Ответ

0 голосов
/ 14 апреля 2020

Помимо решения вашей проблемы, вы можете сделать множество вещей, чтобы улучшить свой код:

  1. Используйте тип данных date для вашей даты рождения.
  2. Не используйте int для почтового индекса. Если вы этого еще не сделали, вам в конечном итоге потребуется буква или пробел.
  3. Не назначайте studentId вручную, используйте столбец identity. В противном случае вы столкнетесь с проблемами обслуживания идентификаторов / дублирования Если у вас также есть человек studentId, сохраните его как другой столбец, сохранив идентификатор первичного ключа в качестве идентификатора.
  4. Всегда полностью указывайте вставляемые столбцы - это рекомендуемый способ написания оператора вставки и избавит вас от проблем позже, если вы измените определение таблицы.

Наконец, чтобы решить проблему, о которой вы спрашивали, укажите столбцы для вставки в операторе вставки (см. официальные документы ). ) и используйте предложение where для предотвращения добавления дубликата. Я использовал столбец studentId в качестве простого примера, но поскольку вы действительно должны использовать столбец identity, вы не сможете использовать его для проверки дубликатов. Вместо этого вы должны использовать имя + дату рождения (или подобное).

Вы можете проверять параметры в соответствии с любыми правилами и возвращать их без попытки вставки.

Возврат уникального кода результата простой способ для вашего вызывающего кода узнать, произошла ли успешная вставка или произошла ошибка. Вы присваиваете результат как exec @MyResult = AddStudents {parameter list here}, где @MyResult определено в контексте вызова.

    CREATE PROCEDURE AddStudents
    (
      @studentID int
      , @firstname varchar(100)
      , @lastname varchar(100)
      , @gender varchar(6)
      , @streetAdress varchar(100)
      , @zipcode int
      , @city varchar(100)
      , @country varchar(100)
      , @birthdate varchar(100)
      , @studentType varchar(100)
    )
    as
    begin
      set nocount on;

      -- Add parameter validation as required e.g.
      if coalesce(@firstname,'') = '' return 98;

      insert into Students (studentID, firstname, lastname, gender, streetAdress, zipcode, city, country, birthdate, studentType)
        select @studentID, @firstname, @lastname, @gender, @streetAdress,
          @zipcode, @city, @country, @birthdate, @studentType
        -- use the where clause to see whether a duplicate student already exists
        where not exists (
          select 1
          from Students
          where studentID = @studentID
          -- Add any other checks required to avoid a duplicate
        )

      -- Check the return result to see whether a new student record was added or not
      return case when @@rowcount = 1 then 0 else 99 end;
    end
    go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...