web-dev-qa-db-de.com

Wie konvertiere ich int in char mit führenden Nullen?

Ich muss int datafield in nvarchar mit führenden Nullen konvertieren

beispiel:

1 konvertiere zu '001'

867 konvertieren in '000867' usw.

vielen Dank.


Dies ist meine Antwort 4 Stunden später ...

Ich habe dieses T-SQL-Skript getestet und arbeite gut für mich!

DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED

SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED

Ich habe diese Benutzerfunktion erstellt

T-SQL-Code:

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

    -- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number

    -- @intlen contains the string size to return
    IF @intlen > 20
       SET @intlen = 20

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

END

Beispiel:

SELECT dbo.CIntToChar (867, 6) AS COD_ID

AUSGABE

000867

84
RicardoBalda

Versuchen Sie folgendes: select right('00000' + cast(Your_Field as varchar(5)), 5)

Das Ergebnis wird in 5 Ziffern angezeigt, z. B. 00001, ...., 01234

82
Nguyen Tran

Sie können auch die Funktion FORMAT () verwenden, die in SQL Server 2012 . http://technet.Microsoft.com/library/hh213505.aspx eingeführt wurde.

DECLARE @number1 INT, @number2 INT

SET @number1 = 1
SET @number2 = 867

SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')
44
Darek.K

Verwenden Sie REPLICATE, damit Sie nicht alle führenden Nullen hart codieren müssen:

DECLARE @InputStr int
       ,@Size     int
SELECT @InputStr=123
      ,@Size=10

PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)

AUSGABE:

0000000123
21
KM.

Nicht zu hoch diese Frage, aber der Hinweis muss gemacht werden, dass Sie (N) VARCHAR anstelle von (N) CHAR-Datentyp verwenden müssen.

RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )

Das obige Segment liefert nicht die korrekte Antwort von SQL 2005

RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )

Im obigen Segment wird die gewünschte Antwort von SQL 2005 erzeugt

Der varchar gibt Ihnen die gewünschte Präfixlänge im laufenden Betrieb an, wobei der Datentyp mit fester Länge eine Längenangabe und -anpassung erfordert.

13
GoldBishop

Der Datentyp "int" darf nicht mehr als 10 Stellen haben, außerdem funktioniert die Funktion "Len ()" für ints. Daher muss das int nicht in einen String konvertiert werden, bevor die Funktion len () aufgerufen wird.

Schließlich berücksichtigen Sie nicht den Fall, in dem die Größe Ihres Int> die Gesamtzahl der Stellen, zu denen es aufgefüllt werden soll (@intLen), berücksichtigt wird.

Eine präzisere/korrekte Lösung ist daher:

CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
    IF @intlen > 20 SET @intlen = 20
    IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
    RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END
4
C.List

Ich benutze gerne 

DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4

select right( POWER(10, @Length) + @Number, @Length)

das gibt mir 

000000004
4
Sedecimdies

Nicht sehr elegant, aber ich füge einen Wert mit der gleichen Anzahl von führenden Nullen, die ich möchte, zu der Zahl hinzu, die ich konvertieren möchte, und verwende die RECHTS-Funktion.

Beispiel:

SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)

Ergebnis: '000867'

2
Brute Force SQL

Einzeilige Lösung ( per se ) für SQL Server 2008 oder höher:

DECLARE @DesiredLenght INT = 20;
SELECT 
    CONCAT(
        REPLICATE(
            '0',
            (@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
        [Column])
FROM Table;

Multiplikation mit SIGN Ausdruck entspricht MAX(0, @DesiredLenght-LEN([Column])). Das Problem ist, dass MAX() nur ein Argument akzeptiert ...

1
Piotr Nawrot
    select right('000' + convert(varchar(3),id),3) from table

    example
    declare @i int
    select @i =1

select right('000' + convert(varchar(3),@i),3)

Übrigens, wenn es sich um eine int-Spalte handelt, werden die Nullen nicht beibehalten Machen Sie es einfach in der Präsentationsschicht oder wenn Sie wirklich in der

1
Tarun Gupta

In meinem Fall wollte ich, dass mein Feld führende Nullen in 10-Zeichen-Feldern (NVARCHAR (10)) ..__ hat. Die Quelldatei hat nicht die führenden 0en, die benötigt werden, um dann in eine andere Tabelle aufgenommen zu werden auf SQL Server 2008R2 sein:

Set Field = right (('0000000000' + [Field]), 10) (Format () kann nicht verwendet werden, da dies vor SQL2012 ist)

Dies wurde anhand der vorhandenen Daten durchgeführt. Auf diese Weise füllt 1 oder 987654321 weiterhin alle 10 Leerzeichen mit führenden Nullen.

Da die neuen Daten importiert und dann über eine Access-Datenbank in die Tabelle gespeichert werden, kann ich beim Anhängen von Access an die SQL Server-Tabelle für neue Datensätze Format ([Feld], "0000000000") verwenden.

1
jhimes

Ich habe einen guten Artikel gefunden hier :

Eine Zeichenfolge mit führenden Nullen auffüllen

Ich muss das oft tun bei der Ausgabe von Daten mit fester Länge Exportiere beispielsweise eine numerische Spalte ist 9 Zeichen lang und Sie müssen mit führenden 0 vorangestellt werden.

1
Andrew Hare

Hatte dasselbe Problem, so habe ich gelöst ... Einfach und elegant. Die "4" gibt an, wie lang die Zeichenfolge sein soll. Unabhängig davon, welche Länge der Ganzzahl übergeben wird, füllt sie mit Nullen bis "4".

STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))
1
user2096582
DECLARE @number1 INT, @number2 INT

SET @number1 = 1

SET @number2 = 867

- Ohne 'RTRIM' lautet der zurückgegebene Wert 3__ !!!

SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED

- Ohne 'RTRIM' lautet der zurückgegebene Wert 867___ !!! 

SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED
0
John Lonberger

Diese Arbeit für mich in MySQL:

FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
  RETURNS varchar(255) CHARSET utf8
BEGIN
  return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END

Zum Beispiel:

leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'

Ich hoffe, das wird helfen

0
Tricky Silence

Die Verwendung von RIGHT ist eine gute Option, Sie können jedoch auch Folgendes tun:

SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)

dabei ist N die Gesamtzahl der Ziffern, die angezeigt werden sollen. Also für einen 3-stelligen Wert mit führenden Nullen (N = 3):

SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)

oder abwechselnd

SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)

Dazu wird der gewünschte Wert zu einer Potenz von 10 addiert, die groß genug ist, um genügend führende Nullen zu erzeugen, und dann die führende 1 abgeschnitten.

Der Vorteil dieser Technik ist, dass das Ergebnis immer die gleiche Länge hat, sodass SUBSTRING anstelle von RIGHT verwendet werden kann, was in einigen Abfragesprachen (z. B. HQL) nicht verfügbar ist.

0
Peter Gluck