550 Stimmen

Füllen Sie einen String mit führenden Nullen auf, sodass er in SQL Server 2008 3 Zeichen lang ist

Ich habe eine Zeichenfolge, die beim ersten Erstellen in SQL Server 2008 R2 bis zu 3 Zeichen lang ist.

Ich möchte sie mit führenden Nullen auffüllen, damit der neue Wert beispielsweise '001' ist, wenn der ursprüngliche Wert '1' war. Oder wenn der ursprüngliche Wert '23' war, ist der neue Wert '023'. Oder wenn der ursprüngliche Wert '124' war, bleibt der neue Wert gleich wie der ursprüngliche Wert.

Ich verwende SQL Server 2008 R2. Wie würde ich das mit T-SQL machen?

1voto

nicky Punkte 268

Ich habe das geschrieben, weil ich Anforderungen bis zu einer bestimmten Länge hatte (9). Polstert nur links mit dem @pattern auf, wenn die Eingabe aufgepolstert werden muss. Sollte immer die in @pattern definierte Länge zurückgeben.

declare @charInput as char(50) = 'input'

--immer NULL behandeln :)
set @charInput = isnull(@charInput,'')

declare @actualLength as int = len(@charInput)

declare @pattern as char(50) = '123456789'
declare @prefLength as int = len(@pattern)

if @prefLength > @actualLength
    select Left(Left(@pattern, @prefLength-@actualLength) + @charInput, @prefLength)
else
    select @charInput

Gibt 1234input zurück

0voto

Red Punkte 2614

Ich bin speziell hierher gekommen, um herauszufinden, wie ich meinen Zeitzonenoffset in einen Zeichenfolge für die Zeitzonenkonvertierung von Datum zu DATETIMEOFFSET in SQL Server 2008 umwandeln kann. Brutal, aber notwendig.

Also brauche ich eine Methode, die mit negativen und positiven Zahlen umgehen kann und sie auf zwei Zeichen mit einer führenden Null formatiert, wenn nötig. Die Antwort von Anon hat mich fast erreicht, aber negative Zeitzonenwerte würden als 0-5 herauskommen, anstelle des erforderlichen -05

Also mit ein paar Anpassungen an seiner Antwort funktioniert dies für alle Konvertierungen der Zeitzonenstunde

DECLARE @n INT = 13 -- Funktioniert mit -13, -5, 0, 5, etc
SELECT CASE 
    WHEN @n < 0 THEN '-' + REPLACE(STR(@n * -1 ,2),' ','0') 
    ELSE '+' + REPLACE(STR(@n,2),' ','0') END + ':00'

-1voto

Shane Punkte 9

Ich habe diese Funktion erstellt, die für bigint und eine führende Null oder ein anderes einzelnes Zeichen (maximal 20 Zeichen zurückgegeben) geeignet ist und die Länge der Ergebnisse kürzer als die Länge der Eingabenummer zulässt:

create FUNCTION fnPadNum (
  @Num BIGINT --Zu paddelnde Nummer, @sLen BIGINT --Gesamtlänge der Ergebnisse , @PadChar varchar(1))
  RETURNS VARCHAR(20)
  AS
  --Padet bigint mit führenden 0's
            --Beispiel:  "select dbo.fnPadNum(201,5,'0')" gibt "00201" zurück
            --Beispiel:  "select dbo.fnPadNum(201,5,'*')" gibt "**201" zurück
            --Beispiel:  "select dbo.fnPadNum(201,5,' ')" gibt "  201" zurück
   BEGIN
     DECLARE @Results VARCHAR(20)
     SELECT @Results = CASE 
     WHEN @sLen >= len(ISNULL(@Num, 0))
     THEN replicate(@PadChar, @sLen - len(@Num)) + CAST(ISNULL(@Num, 0) AS VARCHAR)
     ELSE CAST(ISNULL(@Num, 0) AS VARCHAR)
     END

     RETURN @Results
     END
     GO

     --Verwendung:
      SELECT dbo.fnPadNum(201, 5,'0')
      SELECT dbo.fnPadNum(201, 5,'*')
      SELECT dbo.fnPadNum(201, 5,' ')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X