Am un string care este de până la 3 caractere, atunci când l's a creat pentru prima dată în SQL Server 2008 R2.
Aș dori să-pad cu zero, deci, dacă valoarea sa inițială a fost '1' apoi noua valoare va fi '001'. Sau dacă valoarea sa inițială a fost '23' noua valoare este '023'. Sau dacă valoarea sa inițială este '124' apoi noua valoare este aceeași ca valoarea inițială.
Eu sunt, folosind SQL Server 2008 R2. Cum aș putea face acest lucru, folosind T-SQL?
Dacă domeniul este deja un șir de caractere, acest lucru va funcționa
SELECT RIGHT('000'+ISNULL(field,''),3)
Dacă doriți null-uri pentru a arăta ca '000'
Acesta ar putea fi un număr întreg-atunci ce-ar vrea
SELECT RIGHT('000'+CAST(field AS VARCHAR(3)),3)
Cum cere întrebarea asta răspunsul funcționează numai dacă lungimea <= 3, dacă vrei ceva mai mare, aveți nevoie pentru a schimba constantă șir și două întreg constante la lățimea necesară. de exemplu
'0000' și VARCHAR(4)),4
Deși întrebarea a fost pentru SQL Server 2008 R2, în cazul în care cineva este de lectură acest lucru cu versiunea 2012 și mai sus, de atunci a devenit mult mai ușor prin utilizarea de FORMAT.
Puteți fie să treacă un standard numeric format string sau custom format numeric string ca format argument (multumesc Vadim Ovchinnikov pentru acest indiciu).
Pentru această întrebare, de exemplu, un cod de genul
DECLARE @myInt INT = 1;
-- One way using a standard numeric format string
PRINT FORMAT(@myInt,'D3');
-- Other way using a custom numeric format string
PRINT FORMAT(@myInt,'00#');
ieșiri
001
001
În condiții de siguranță metoda:
SELECT REPLACE(STR(n,3),' ','0')
Acest lucru are avantajul de a se întoarce șirul'***'
pentru n < 0 sau n > 999, care este un frumos și evident indicator al out-of-limite de intrare. Celelalte metode enumerate aici va eșua în tăcere prin trunchierea intrare pentru un 3-subșir de caractere.
Aici's-o mai general, tehnica de stânga-padding la orice lățime dorită:
declare @x int = 123 -- value to be padded
declare @width int = 25 -- desired width
declare @pad char(1) = '0' -- pad character
select right_justified = replicate(
@pad ,
@width-len(convert(varchar(100),@x))
)
+ convert(varchar(100),@x)
Cu toate acestea, dacă te're de-a face cu valori negative, și umplutură cu zerourile, nici acest lucru și nici alte sugerat tehnica va lucra. Te'll a obține ceva care arata ca aceasta:
00-123
[Probabil nu asta ai vrut]
Deci … te'll trebuie să sari prin unele suplimentare cercuri Aici's o abordare care va formata corect numere negative:
declare @x float = -1.234
declare @width int = 20
declare @pad char(1) = '0'
select right_justified = stuff(
convert(varchar(99),@x) , -- source string (converted from numeric value)
case when @x < 0 then 2 else 1 end , -- insert position
0 , -- count of characters to remove from source string
replicate(@pad,@width-len(convert(varchar(99),@x)) ) -- text to be inserted
)
Unul ar trebui să rețineți că a converti()
trebuie să specificați un [n]varchar
de lungime suficientă pentru a ține rezultatul convertit cu trunchiere.
Aici este o variantă a Hogan'răspunsul pe care îl folosesc în SQL Server Express 2012:
SELECT RIGHT(CONCAT('000', field), 3)
În loc de îngrijorătoare dacă domeniul este un șir de caractere sau nu, eu doar CONCAT
, din moment ce este'll ieșire un șir oricum. În plus, în cazul în care domeniul poate fi o NUL
, folosind ISNULL
ar putea fi necesar pentru a evita funcția de asistent NULL
rezultatele.
SELECT RIGHT(CONCAT('000', ISNULL(field,'')), 3)
Utilizați această funcție care se potrivește în fiecare situație.
CREATE FUNCTION dbo.fnNumPadLeft (@input INT, @pad tinyint)
RETURNS VARCHAR(250)
AS BEGIN
DECLARE @NumStr VARCHAR(250)
SET @NumStr = LTRIM(@input)
IF(@pad > LEN(@NumStr))
SET @NumStr = REPLICATE('0', @Pad - LEN(@NumStr)) + @NumStr;
RETURN @NumStr;
END
Eșantionul de ieșire
SELECT [dbo].[fnNumPadLeft] (2016,10) -- returns 0000002016
SELECT [dbo].[fnNumPadLeft] (2016,5) -- returns 02016
SELECT [dbo].[fnNumPadLeft] (2016,2) -- returns 2016
SELECT [dbo].[fnNumPadLeft] (2016,0) -- returns 2016
Știu că e vechi bilet am gândit să-l împărtășească.
Am gasit acest cod în căutarea pentru o soluție. Nu sunt sigur dacă acesta funcționează pe toate versiunile de MSSQL am MSSQL 2016.
declare @value as nvarchar(50) = 23
select REPLACE(STR(CAST(@value AS INT) + 1,4), SPACE(1), '0') as Leadingzero
întoarce "0023" 4 în STR funcție este lungimea totală, inclusiv valoarea. Exemplu 4, 23 și 123 vor avea toate 4 in STR și cantitatea corectă de zerouri vor fi adăugate. Puteți crește sau scădea. Nu este nevoie pentru a obține o lungime de 23.
Edit: văd că la fel ca @Anon post.
Am avut problema asemanatoare cu coloană întreg ca date de intrare atunci când am nevoie de dimensiuni fixe varchar (sau șir de caractere) de ieșire. De exemplu, de la 1 la '01', 12 pentru a '12'. Acest cod funcționează:
SELECT RIGHT(CONCAT('00',field::text),2)
Dacă intrarea este, de asemenea, o coloană de varchar, puteți evita turnare parte.
A scris acest lucru pentru că am avut cerințele pentru până la o anumită lungime (9). Tampoane stânga cu @model NUMAI atunci când intrarea are nevoie de umplutură. Ar trebui să se întoarcă mereu lungime definită în @model.
declare @charInput as char(50) = 'input'
--always handle NULL :)
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
Se întoarce 1234input
Simplu este că
Cum ar fi:
DECLARE @DUENO BIGINT
SET @DUENO=5
SELECT 'ND'+STUFF('000000',6-LEN(RTRIM(@DueNo))+1,LEN(RTRIM(@DueNo)),RTRIM(@DueNo)) DUENO
Am creat această funcție, care să satisfacă pentru bigint și un zero sau a altor singur caracter (maxim 20 de caractere întors) și vă permite pentru lungimea de rezultate mai puțin decât lungimea de numărul de intrare:
create FUNCTION fnPadNum (
@Num BIGINT --Number to be padded, @sLen BIGINT --Total length of results , @PadChar varchar(1))
RETURNS VARCHAR(20)
AS
--Pads bigint with leading 0's
--Sample: "select dbo.fnPadNum(201,5,'0')" returns "00201"
--Sample: "select dbo.fnPadNum(201,5,'*')" returns "**201"
--Sample: "select dbo.fnPadNum(201,5,' ')" returns " 201"
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
--Usage:
SELECT dbo.fnPadNum(201, 5,'0')
SELECT dbo.fnPadNum(201, 5,'*')
SELECT dbo.fnPadNum(201, 5,' ')