2011-01-05 7 views
0

Ich habe eine Tabelle Kontakte.T-SQL Eindeutige Codes generieren

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 

Ich möchte in der Lage sein, einen 10-stellige Kontakt Code aus der gespeicherten Prozedur zu erzeugen, die von

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. 

Beispiel umfassen sollte.

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

Die vorgeschlagene Lösung könnte eine Funktion sein, die innerhalb der gespeicherten Prozedur aufgerufen werden kann, bevor die Werte in der Tabelle gespeichert werden.

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

Kann jemand helfen?

+0

Warum verwenden Sie 'nvarchar (10)' wenn es immer 10 Zeichen lang sein wird? –

+0

Weil char kein Unicode-Zeichen speichern kann :). –

+1

NChar kann aber – Robb

Antwort

1

Mit einer RANKING Klausel eine Option den Trick.

;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 
+0

Ich werde überprüfen und dann auf Sie zurückkommen. Vielen Dank für die freundliche Unterstützung. –

+0

Hallo Lieven, es sieht gut aus und funktioniert wie ein Zauber. Da der Code vor dem Einfügen in die Tabelle generiert werden soll, können Sie den Code bitte in die Funktion einbinden, die ich in meiner Frage erwähnt habe. Vielen Dank. –

+0

@Nick - kannst du das selbst herausfinden oder ist es offen? –

1

Diese Funktion sollte

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 
+0

Danke, es funktioniert. –

Verwandte Themen