我一直在努力,現在得到這個權利有一段時間了,沒有用。噸-SQL字符串唯一的ID(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")
);
的問題是它包含唯一的字符串每個記錄客戶ID字段(ALFKI,BERGS,BERGS等)
我想打一個存儲過程,而將插入新的數據行,並創建一個獨特的客戶ID。由於我需要字符串長度爲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(設置@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 –