x
DECLARE @ID VARCHAR(10)='',@I INT=0,@RAND_ CHAR(1)
WHILE @I<10
BEGIN
SET @RAND_=CONVERT(CHAR,FLOOR(RAND()*10))
SET @ID+=@RAND_
SET @I+=1
END
SELECT @ID
If i make it like that it returns me a 10 digit number, but if i try it like that
DECLARE @ID VARCHAR(20)='',@I INT=0
WHILE @I<10
BEGIN
SET @ID+=CONVERT(CHAR,FLOOR(RAND()*10))
SET @I+=1
END
SELECT @ID
it returns only 1 digit.Why,isn’t it the same thing?
Advertisement
Answer
In this line:
SET @ID += CONVERT(CHAR, FLOOR(RAND()*10))
The length is not being specified. The default length is 30, and char
will pad the rest of the length with spaces. So @ID
is already filled, and therefore cannot be added to.
This is fully documented online:
When
n
isn’t specified in a data definition or variable declaration statement, the default length is 1. Ifn
isn’t specified when using the CAST and CONVERT functions, the default length is 30.
Had you specified the length, or used varchar
, this would not have happened.
SET @ID += CONVERT(CHAR(1), FLOOR(RAND()*10))
Always specify char
and varchar
lengths explicitly