Я хочу получить 5-символьную строку, скомпилированную из имени строки, точно так же, как в Пример базы данных MS Northwind (Customers.CustomerID):
CustomerID CompanyName
----- ----------------------------------
ALFKI Alfreds Futterkiste
ANATR Ana Trujillo Emparedados y helados
ANTON Antonio Moreno Taquería
AROUT Around the Horn
BERGS Berglunds snabbköp
BLAUS Blauer See Delikatessen
BLONP Blondesddsl pere et fils
BOLID Bólido Comidas preparadas
BONAP Bon app'
BOTTM Bottom-Dollar Markets
BSBEV B's Beverages
... ...
Итакидентификатор (код) не является полностью случайным, он как-то напоминает содержимое имени строки.Очевидно, что двуличие запрещено, код должен быть уникальным.Давайте предположим:
DECLARE @StrCode NCHAR(5)
Я бы начал с разбивки по этим линиям - я бы создал скалярную функцию для проверки дубликатов, которая возвращала бы 0 для отсутствия дубликатов и 1 для найденных дубликатов, проверка ядра была бы простосчитая строки предоставленного строкового кода:
SELECT COUNT(ID) FROM MyTable WHERE StrCode = @StrCode
А затем в другой функции (input = StringName, output = @StrCode) я бы попробовал несколько подходов, от самого читаемого до наименее читаемого, ипроверяйте каждую попытку на двойственность на своем пути:
SELECT @StrCode =
CASE
WHEN dbo.CheckForDuplicity(SUBSTRING(@StringName,1,6)) = 0
THEN SUBSTRING(@StringName,1,6) -- get start of the string name
WHEN CHARINDEX(' ',@StringName) > 0 AND dbo.CheckForDuplicity(CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,CHARINDEX(' ',@StringName)+1,2))) = 0
THEN CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,CHARINDEX(' ',@StringName)+1,2)) -- get 3 chars from the 1st word and 2 chars from the 2nd
WHEN dbo.CheckForDuplicity(CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,LEN(@StringName)-3,2))) = 0
THEN CONCAT(SUBSTRING(@StringName,1,3),SUBSTRING(@StringName,LEN(@StringName)-3,2)) -- get first 3 chars and last 2 chars
-- possibly other approaches...
END
Таким образом, первая будет принята.Но, может быть, есть и лучшие подходы, о которых я не знаю ...
Это всего лишь концепция.Это хорошая идея?
А как насчет использования этого StringCode в качестве первичного ключа, как это делают в Northwind?Не замедлит ли этот строковый ключ, по сравнению с ключом INT?