T-SQL 生成唯一代码

发布于 2024-10-10 07:12:50 字数 1158 浏览 0 评论 0原文

我有一个表联系人。

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

有人可以帮忙吗?

I have a table contacts.

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

I would like to be able to generate a 10-digit contact code from the stored procedure which should comprise of

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.

Example.

John M. Denver = JOMDE-0001
John Denver    = JODEN-0001
John Denver    = JODEN-0002
Bob Dylan      = BODYL-0001

Proposed solution could be a function which could be called from inside the stored procedure before saving the values to the table.

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

Can anybody help?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最单纯的乌龟 2024-10-17 07:12:50

使用 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

Using a RANKING clause is one option.

;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
东走西顾 2024-10-17 07:12:50

这个函数应该可以解决问题

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

This function should do the trick

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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文