我希望从字符串名称中获取一个5个字符长的字符串,就像它在MS Northwind sample database中一样(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
... ...
因此ID(代码)不是完全随机的,它在某种程度上类似于字符串名称的内容。显然,禁止双重性,代码必须是唯一的。我们假设:
DECLARE @StrCode NCHAR(5)
我开始在theese线上进行操作 - 我会创建一个标量函数来检查重复数据,这些重复数据将返回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键相比,这个字符串键不会减慢速度吗?