2016-05-09 3 views
0
My Out put like This : If it is North "N00001 
             N00002 
         If it is South "S00001 
             S00002 

Hier ist mein Versuchte-CodeWie wird eine 5-stellige Inkrementnummer basierend auf Zone generiert?

Declare @Zone varchar(20),@ZoneID int,@id varchar(10) 

Set @Zone = 'S' 

Select @ZoneID = cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') as varchar) from memberprofiles Where left(idno,1) = @Zone 
Set @id = @Zone+cast(@ZoneID as varchar) 
select @id 

Aber jedes Mal wenn ich "S1" bin immer Aber ich brauche "S00001"

Wie kann ich Zone weist Anzahl Generation

+0

http://stackoverflow.com/questions/16760900/pad-a-string-with-leading-zeros-so-its-3-characters-long-in-sql- Server-2008 –

Antwort

3

Diese Frage erzeugen ist ein "geschlossen als Duplikat" -Kandidat. Aber, da es mehrere Mängel sind, ich glaube, es lohnt sich eine Antwort:

  1. In Ihrer Datenbank Sie scheinen eine Spalte „Idno“ zu haben, mit einem führenden Zeichen markieren die Zone. Wenn das stimmt, sollten Sie - wenn immer möglich - das Design ändern. Die Nummer und die Zonenmarkierung sollten sich in zwei Spalten befinden. Jede Kombination davon ist eine Präsentationsproblem

  2. Ihre LEFT(Idno,1) wird schlecht funktionieren (lesen Sie über "Sargability"). Wenn es einen Index für Idno gibt, sollten Sie besser mit Idno LIKE ' + @Zone + '%'

  3. Sind Sie sicher, dass in "memberprofiles" gibt es nur eine Zeile, in der Ihre WHERE-Klausel wahr ist? Wenn nicht, welche Nummer würden Sie in "@ZoneID" nach Ihrer SELECT erwarten?

  4. Ihr cast(isnull(max(cast(replace(Idno,@Zone,'') as numeric))+1,'00000') ... ersetzt das führende "S" durch nichts, in der Hoffnung, dass noch eine Zahl übrig ist. Du bekommst die höchste Zahl (OK, das beantwortet Punkt 3, ist aber immer noch sehr - uhm - hacky), trotzdem erwartest du einen "NULL" wo du eine "00000" zurückgeben würdest. Das schreit nach einem besseren Design laut :-)

  5. Sie sollten versuchen, in "Set Basis" bekommen denken, dann lieber "prozedurale" Denken ...

Versuchen Sie, diese

CREATE TABLE #memberprofile(Idno VARCHAR(100),OtherColumn VARCHAR(100)); 
INSERT INTO #memberprofile VALUES('N3','Test North 3'),('S24','Test South 24'),('N14','Test North 14') 

DECLARE @Zone VARCHAR(20)='N'; 

SELECT * 
     ,ZoneCode + REPLACE(STR(Number,5),' ','0') AS YourNewPaddedCode  
FROM #memberprofile 
CROSS APPLY 
(
    SELECT LEFT(Idno,1) AS ZoneCode 
      ,CAST(SUBSTRING(Idno,2,1000) AS INT) AS Number 
) AS Idno_in_parts 
WHERE [email protected]; 
GO 

--Clean up 
--DROP TABLE #memberprofile 

Das Ergebnis

Idno OtherColumn ZoneCode Number YourNewPaddedCode 
N3  Test North 3 N  3  N00003 
N14  Test North 14 N  14  N00014 
Verwandte Themen