2008-11-21 43 views

Trả lời

35
Declare @MyInt integer Set @MyInt = 123 
Declare @StrLen TinyInt Set @StrLen = 8 

Select Replace(Str(@MyInt, @StrLen), ' ' , '0') 
+0

Hoặc trên bay nếu độ dài cố định được đưa ra: 'SELECT REPLACE (STR (DATEPART (THÁNG, [Ngày]), 2), '', '0')' – dakab

35

Một cách khác là:

DECLARE @iVal int = 1 
select REPLACE(STR(@iVal, 8, 0), ' ', '0') 
+0

Làm thế nào mà làm việc? – Coops

+1

Tôi đã làm và nó hoạt động Tôi đã hỏi nhiều hơn về cách các chức năng này hoạt động cùng nhau, có lẽ câu hỏi là tại sao không có phương pháp tích hợp cho nó – Coops

+0

Để chỉ rời khỏi không gian hàng đầu, hãy xóa Thay thế, ví dụ: chọn STR (@iVal, 8, 0) –

0

Hoặc nếu bạn thực sự muốn đi hard-core ... ;-)

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 
1

Nếu tôi đang cố gắng để pad để một tổng chiều dài cụ thể, tôi sử dụng các hàm REPLICATE và DATALENGTH, như vậy:

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 

Tôi đã sử dụng các biến ở đây để đơn giản, nhưng bạn thấy, bạn có thể chỉ định chiều dài cuối cùng của chuỗi tổng và không lo lắng về kích thước của INT mà bạn bắt đầu với miễn là < = độ dài chuỗi cuối cùng.

1

tôi luôn luôn sử dụng:

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

z dừng SQL từ ngầm coverting chuỗi thành một int cho việc bổ sung/nối.

1

Nếu int có thể đi tiêu cực bạn gặp rắc rối, vì vậy để làm được việc này đôi khi tôi làm điều này:

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 
+0

Cảm ơn bắt trường hợp này. –

7

Công việc này cho tôi:

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

...

Tôi đã tạo chức năng người dùng này

Mã T-SQL:

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 

Ví dụ:

CHỌN dbo.CIntToChar (867, 6) AS COD_ID

OUTPUT

28

như của SQL Server 2012 bạn bây giờ có thể làm điều này:

format(@int, '0000#') 
+3

Tôi yêu bạn gordy :) – Charles380

+0

tuyệt vời !! Cảm ơn! –

+0

Giải pháp gọn gàng cho sucky int :) – wwmbes

0

Và sau đó có o này ne, sử dụng REPLICATE:

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

Tất nhiên, bạn có thể thay thế các chữ 7 và '1' bằng các chức năng thích hợp nếu cần; ở trên cung cấp cho bạn ví dụ của bạn. Ví dụ:

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

sẽ pad một số nguyên nhỏ hơn 8 vị trí với số không lên đến 8 ký tự.

Bây giờ, một số âm trong đối số thứ hai của REPLICATE sẽ trả về NULL.Vì vậy, nếu đó là khả năng (ví dụ: @myInt có thể trên 100 triệu trong ví dụ trên), thì bạn có thể sử dụng COALESCE để trả về số không có số 0 đứng đầu nếu có nhiều hơn 8 ký tự:

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

Rất thẳng về phía trước để suy nghĩ về đệm với '0 là, nếu bạn cố định @ _int của bạn để có 4 số thập phân, bạn tiêm 4' 0's:

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

; nếu không gian cố định của bạn là 3, bạn tiêm 3'0's

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

; dưới đây tôi tiêm '00' để tạo ra 99 nhãn cho mỗi Bldg

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 

Kết quả là:

'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' 
Các vấn đề liên quan