T-SQL генерирует уникальные коды - PullRequest
0 голосов
/ 05 января 2011

У меня есть таблица контактов.

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

Кто-нибудь может помочь?

Ответы [ 2 ]

1 голос
/ 05 января 2011

Использование предложения RANKING является одним из вариантов.

;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
1 голос
/ 05 января 2011

Эта функция должна помочь

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...