Я пытаюсь получить это право в течение некоторого времени без использования.t-sql string уникальный идентификатор (база данных Northwind)
У меня есть таблица в базе данных MSSQL, и я хочу, чтобы вставить новую строку, используя хранимую процедуру
CREATE TABLE "Customers" (
"CustomerID" NCHAR(5) NOT NULL,
"CompanyName" NVARCHAR(40) NOT NULL,
"ContactName" NVARCHAR(30) NULL,
"ContactTitle" NVARCHAR(30) NULL,
"Address" NVARCHAR(60) NULL,
"City" NVARCHAR(15) NULL,
"Region" NVARCHAR(15) NULL,
"PostalCode" NVARCHAR(10) NULL,
"Country" NVARCHAR(15) NULL,
"Phone" NVARCHAR(24) NULL,
"Fax" NVARCHAR(24) NULL,
PRIMARY KEY ("CustomerID")
);
Проблема состоит в том CustomerID поле, которое содержит уникальную строку для каждой записи (ALFKI, айсберги, BERGS и т.д.)
Я хочу создать хранимую процедуру, которая вставляет строку с новыми данными и создает уникальный CustomerID. Сборка функций не может быть решена, так как мне нужна строка длиной 5 символов.
у меня есть процедура, которая генерирует 5 символов ID следующего
begin
declare @chars char(26) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
declare @i int = 0
declare @id varchar(max) = ''
while @i < 5
begin
set @id = @id + substring(@chars, cast(ceiling(rand() * 26) as int), 1)
set @i = @i + 1
end
Select (cast(@id as nvarchar(400)))
end
и тот, который я пытался сделать работу без применения. Предполагается выбрать уникальный идентификатор (набор @Id = «ANATR» есть с целью сделать его в петлю
begin
declare @randID varchar(5) = ''
declare @selectID varchar(20) = ''
declare @chars char(26) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
declare @i int = 0
declare @id varchar(10) = ''
while @i < 5
begin
set @id = @id + substring(@chars, cast(ceiling(rand() * 26) as int), 1)
set @i = @i + 1
end
select @id
set @id = 'ANATR'
SET @selectID = (SELECT CustomerID FROM CUSTOMERS WHERE CustomerID = @id)
while @selectID <> 'NULL'
begin
set @id = ''
while @i < 5
begin
set @id = @id + substring(@chars, cast(ceiling(rand() * 26) as int), 1)
set @i = @i + 1
end
SET @selectID = (SELECT CustomerID FROM CUSTOMERS WHERE CustomerID = @id)
SELECT @id
end
end
Здесь процедура вставки У меня есть на данный момент
CREATE PROCEDURE [dbo].[InsertCustomers]
(
@CustomerID nchar(5),
@CompanyName nvarchar(40),
@ContactName nvarchar(30) = NULL,
@ContactTitle nvarchar(30) = NULL,
@Address nvarchar(60) = NULL,
@City nvarchar(15) = NULL,
@Region nvarchar(15) = NULL,
@PostalCode nvarchar(10) = NULL,
@Country nvarchar(15) = NULL,
@Phone nvarchar(24) = NULL,
@Fax nvarchar(24) = NULL
)
AS
SET NOCOUNT OFF;
INSERT INTO [dbo].[Customers] ([CustomerID], [CompanyName], [ContactName], [ContactTitle], [Address], [City], [Region], [PostalCode], [Country], [Phone], [Fax]) VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle, @Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax);
По мере того, как таблица Customers становится больше, стоимость чтения всех этих значений для проверки дубликата возрастает, как и ваши шансы на попадание в дубликат. См. Ссылки в моем ответе, чтобы понять, почему это решение просто не будет масштабироваться. –
@ Bartosz, если вашему учителю нравится это решение, вы должны выйти из курса и попросить вернуть свои деньги. Это тип решения, с которым человек базы данных просто не должен быть удовлетворен. Удостоверьтесь, что вы даете своему учителю ссылку на этот вопрос - если вы не хотите учиться на нем, возможно, вы должны дать им шанс ... –
@AaronBertrand Я согласен с вами, и я смеялся, когда я читал ваши комментарий ", если вашему учителю нравится это решение, вы должны выйти из курса и попросить вернуть свои деньги 'lollll –