it-swarm.com.de

Wie konvertiere ich ein int in eine mit Null aufgefüllte Zeichenfolge in T-SQL?

Nehmen wir an, ich habe ein int mit dem Wert 1. Wie kann ich dieses int in eine mit Null aufgefüllte Zeichenfolge konvertieren, beispielsweise 00000001?

39
flipdoubt
Declare @MyInt integer Set @MyInt = 123
Declare @StrLen TinyInt Set @StrLen = 8

Select Replace(Str(@MyInt, @StrLen), ' ' , '0')
39
Charles Bretana

Ein anderer Weg ist:

DECLARE @iVal int = 1
select REPLACE(STR(@iVal, 8, 0), ' ', '0')
35
Mitch Wheat

ab SQL Server 2012 können Sie jetzt Folgendes tun:

format(@int, '0000#')
31
gordy

Diese Arbeit für mich:

SELECT RIGHT('000' + CAST(Table.Field AS VARCHAR(3)),3) FROM Table

...

Ich habe diese Benutzerfunktion erstellt

T-SQL-Code:

CREATE FUNCTION CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(24) AS BEGIN

IF @intlen > 24
   SET @intlen = 24

RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(24),@intVal)))) 
    + CONVERT(nvarchar(24),@intVal) END

Beispiel:

SELECT dbo.CIntToChar (867, 6) AS COD_ID

AUSGABE

000867

9
RicardoBalda

Wenn ich versuche, eine bestimmte Gesamtlänge einzugeben, verwende ich die Funktionen REPLICATE und DATALENGTH wie folgt:

DECLARE @INT INT
DECLARE @UNPADDED VARCHAR(3)
DECLARE @PADDED VARCHAR(3)

SET @INT = 2
SET @UNPADDED = CONVERT(VARCHAR(3),@INT)
SET @PADDED = REPLICATE('0', 3 - DATALENGTH(@UNPADDED)) + @UNPADDED
SELECT @INT, @UNPADDED, @PADDED

Ich habe hier der Einfachheit halber Variablen verwendet, aber Sie können die endgültige Länge der gesamten Zeichenfolge angeben, ohne sich um die Größe des INT zu kümmern, mit dem Sie beginnen, solange die Länge der endgültigen Zeichenfolge <= ist.

1

Wenn das int negativ werden kann, haben Sie ein Problem. Um dies zu umgehen, mache ich manchmal Folgendes:

DECLARE @iVal int 
set @iVal = -1
    select 
        case 
            when @ival >= 0 then right(replicate('0',8) + cast(@ival as nvarchar(8)),8)
            else '-' + right(replicate('0',8) + cast(@ival*-1 as nvarchar(8)),8)
        end
1
Jim Birchall

Ich verwende immer:

SET @padded = RIGHT('z0000000000000'
  + convert(varchar(30), @myInt), 8)

Das z hindert SQL daran, die Zeichenfolge implizit in ein int für die Addition/Verkettung zu konvertieren.

1
Amy B

Verwenden Sie FORMAT(<your number>,'00000000') so viele Nullen, wie Sie benötigen, um Ziffern in Ihrem Endergebnis zu haben.

Hier ist die offizielle Dokumentation der FORMAT-Funktion

1
Ilia Gilmijarow

Es ist eine sehr einfache Art, über Padding mit '0' nachzudenken. Wenn Sie Ihre @ _int mit 4 Dezimalstellen korrigieren, injizieren Sie 4 '0':

    select RIGHT( '0000'+ Convert(varchar, @_int), 4) as txtnum

; Wenn Ihr fester Platz 3 ist, injizieren Sie 3'0s

    select RIGHT( '000'+ Convert(varchar, @_int), 3) as txtnum

; unten spritze ich '00' ein, um 99 Labels für jedes Gebäude zu generieren

declare @_int int
set @_int = 1
while @_int < 100 Begin
    select BldgName + '.Floor_' + RIGHT( '00'+ Convert(varchar, @_int), 2) 
    + '.balcony' from dbo.tbl_FloorInfo group by BldgName
    set @_int = @_int +1
End

Ergebnis ist:

    'BldgA.Floor_01.balcony'
    'BldgB.Floor_01.balcony'
    'BldgC.Floor_01.balcony'
     ..
     ..
    'BldgA.Floor_10.balcony'
    'BldgB.Floor_10.balcony'
    'BldgC.Floor_10.balcony'
     ..
     ..
     ..
    'BldgA.Floor_99.balcony'
    'BldgB.Floor_99.balcony'
    'BldgC.Floor_99.balcony'
1
Jenna Leaf

Oder wenn Sie wirklich hartgesotten sein wollen ... ;-)

declare @int int
set @int = 1

declare @string varchar(max)
set @string = cast(@int as varchar(max))

declare @length int
set @length = len(@string)

declare @MAX int
set @MAX = 8

if @length < @MAX
begin
    declare @zeros varchar(8)
    set @zeros = ''

    declare @counter int
    set @counter = 0

    while (@counter < (@MAX - @length))
    begin
        set @zeros = @zeros + '0'
        set @counter = @counter + 1
    end
    set @string = @zeros + @string
end
print @string
0
user39603

Ich denke, Charles Bretanas Antwort ist die einfachste und schnellste. Eine ähnliche Lösung ohne STR lautet:

SELECT REPLACE(REVERSE(
        CONVERT(CHAR(5 /*<= Target length*/)
                , REVERSE(CONVERT(VARCHAR(100), @MyInt)))
     ), ' ', '0')
0
Diego

Und dann ist da noch eins, mit REPLICATE:

SELECT REPLICATE('0', 7) + '1'

Natürlich können Sie die Literale 7 und '1' bei Bedarf durch entsprechende Funktionen ersetzen. Das obige gibt dir dein Beispiel. Zum Beispiel:

SELECT REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt)

füllt eine ganze Zahl mit weniger als 8 Stellen mit Nullen bis zu 8 Zeichen auf. 

Eine negative Zahl im zweiten Argument von REPLICATE gibt NULL zurück. Wenn dies eine Möglichkeit ist (zum Beispiel könnte @myInt im obigen Beispiel über 100 Millionen sein), können Sie COALESCE verwenden, um die Nummer ohne führende Nullen zurückzugeben, wenn mehr als 8 Zeichen vorhanden sind: 

SELECT COALESCE(REPLICATE('0', 8 - LEN(CONVERT(nvarchar, @myInt))) + CONVERT(nvarchar, @myInt), CONVERT(nvarchar, @myInt))
0
BobRodes