Tsql T-SQL生成唯一代码

Tsql T-SQL生成唯一代码,tsql,stored-procedures,Tsql,Stored Procedures,我有一张桌子 CREATE TABLE [dbo].[Contacts]( [ContactId] [int] IDENTITY(1,1) NOT NULL, [ContactCode] [nvarchar](10) NOT NULL, --UNIQUE [FirstName] [nvarchar](24) NOT NULL, [MiddleName] [nvarchar](12) NULL, [LastName] [nvarchar](24) NOT NULL, CONSTRAIN

我有一张桌子

CREATE TABLE [dbo].[Contacts](
 [ContactId] [int] IDENTITY(1,1) NOT NULL,
 [ContactCode] [nvarchar](10) NOT NULL, --UNIQUE
 [FirstName] [nvarchar](24) NOT NULL,
 [MiddleName] [nvarchar](12) NULL,
 [LastName] [nvarchar](24) NOT NULL,
 CONSTRAINT [PK_Contacts] PRIMARY KEY CLUSTERED 
(
 [ContactId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
我希望能够从存储过程中生成一个10位数的联系人代码,该存储过程应包括

First Two Digits of FirstName
First Digit of MiddleName(When MiddleName is not blank)
First Two or Three(When MiddleName is Blank) Digits of Last Name
Four digit number starting from zero.
例如

John M. Denver = JOMDE-0001
John Denver    = JODEN-0001
John Denver    = JODEN-0002
Bob Dylan      = BODYL-0001
建议的解决方案可以是在将值保存到表之前从存储过程内部调用的函数

CREATE FUNCTION GetContactCode
(
 @FirstName nvarchar(24),
 @MiddleName nvarchar(12),
 @LastName nvarchar(24)
)
RETURNS nvarchar(10)
AS
BEGIN
 RETURN('CODE')
END

有人能帮忙吗?

这个函数应该可以

CREATE FUNCTION GetContactCode
(
 @FirstName nvarchar(24),
 @MiddleName nvarchar(12),
 @LastName nvarchar(24)
)
RETURNS nchar(10)
AS
BEGIN
 declare @contactcode nchar(10)

 select top 1 @contactcode = contactCode
 from contacts
 where
  contactcode like left(@FirstName,2)+
    case    
        when @MiddleName is null or @MiddleName = '' then left(@LastName,3) 
        else left(@MiddleName,1)+left(@LastName,2) 
    end+'%'
 order by contactCode desc

    select @Contactcode = 
    Upper(left(@FirstName,2)+
    case    
        when @MiddleName is null or @MiddleName = '' then left(@LastName,3) 
        else left(@MiddleName,1)+left(@LastName,2) 
    end) + '-' + 
    case 
        when @ContactCode is null then'0001' 
        else replace(str(cast(right(@ContactCode,4) as int)+1,4),' ','0') 
    end

    Return @ContactCode

END
使用子句是一种选择

;WITH q AS (
  SELECT  ContactID 
          , ContactCode = 
              UPPER(
                SUBSTRING(
                  SUBSTRING(FirstName, 1, 2)
                  + ISNULL(SUBSTRING(MiddleName, 1, 1), '')
                  + SUBSTRING(LastName, 1, 3)
                  , 1, 5)
                + '-')          
  FROM    Contacts
)
SELECT  c.*
        , q.ContactCode 
          + RIGHT(REPLICATE('0', 4) 
                  + CAST(
                      RANK() OVER (PARTITION BY q.ContactCode ORDER BY q.ContactID
                    ) AS VARCHAR(4))
                  , 4)
FROM    q INNER JOIN Contacts c ON c.ContactId = q.ContactID

如果nvarchar(10)的长度始终为10个字符,为什么要使用它?因为字符不能存储unicode字符:)。谢谢您的建议。:)使用可变长度数据类型会为每行的每可变长度列增加2字节的开销,因此如果数据确实保证为特定长度,则应避免这种情况。我会检查一下,然后再与您联系。非常感谢您的支持。嗨,Lieven,它看起来不错,很有魅力。由于代码意味着在插入表之前生成,请将代码包装到我在问题中提到的函数中。谢谢。@Nick-你能自己解决这个问题吗?还是让它开着?