Как программно сгенерировать идентификатор для таблицы с помощью хранимой процедуры и вставить? - PullRequest
0 голосов
/ 21 ноября 2018

Я создал таблицу Student в своей базе данных, и мне нужно использовать хранимую процедуру для генерации уникальной StudentID при вставке новых строк, которая должна начинаться с 005 до 025 включительно.

create procedure FillStudent
as
    insert into Student(StudentID)
    values (005)
go

Но тогда я думаю, что если он станет 2-мя цифрами?Будет ли это автоматически делать 010?Или это будет 0010?Если это будет последним, какой лучший способ сделать его таким, как «010»?Я использую SQL Server.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Играть с этим кодом:

CREATE SEQUENCE [dbo].[StudentsID] 
START WITH 5
INCREMENT BY 1
MAXVALUE 25;

CREATE TABLE [dbo].[Student]
(
    [StudentID] CHAR(3)
);


GO

CREATE PROCEDURE [dbo].[FillStudent]
AS
BEGIN;
    INSERT INTO [dbo].[Student] ([StudentID])
    VALUES (RIGHT(NEXT VALUE FOR  [dbo].[StudentsID] + 1000, 3));
END;
GO

GO

EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];
EXEC [dbo].[FillStudent];

SELECT *
FROM [dbo].[Student];



DROP TABLE [dbo].[Student];
DROP PROCEDURE [dbo].[FillStudent];
DROP SEQUENCE [dbo].[StudentsID];

enter image description here

Идея состоит в использовании sequence объекта.

Если вам нужно использовать столбец идентификаторов, вы можете создать таблицу со столбцом идентификаторов, вычисляемым столбцом (это необходимое вам значение) и проверочным ограничением для прекращения добавления записей после достижения id = 25.Выполните следующий скрипт:

CREATE TABLE [dbo].[Student]
(
     [ID] TINYINT IDENTITY(5, 1)
    ,[StudentID] AS RIGHT([ID] + 1000, 3) PERSISTED
    ,CONSTRAINT CK_Student CHECK  ([ID] < 26)
);

INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;
INSERT INTO [dbo].[Student] DEFAULT VALUES;


SELECT *
FROM [dbo].[Student]

DROP TABLE [dbo].[Student]; 

После записи с ID = 25 вы можете увидеть сообщение об ошибке.

0 голосов
/ 21 ноября 2018

Просто сделайте ваш StudentID столбец идентификатораВ вашем случае установите начальное значение равным 5 и увеличьте на 1.

[StudentID] [int] IDENTITY(5,1) NOT NULL

Тогда SQL Server автоматически заполнит этот столбец для вас.Просто игнорируйте этот столбец в вашем операторе INSERT.

Никогда не пытайтесь добавлять начальные нули в фактические данные, хранящиеся в таблице.Это не очень хороший подход.Рекомендованным способом является достижение таких требований путем форматирования данных при поиске.Вы можете достичь этого следующим образом.

REPLACE(STR([StudentID],3),' ','0')

...