2012-06-06 6 views
0

계정이라는 테이블에 데이터를 삽입하고 필드 중 하나에 11부터 시작하여 길이가 9 자리 (예 : 112345673 또는 119876543) 인 임의의 숫자가 필요합니다. SQL 또는 PHP에서이 작업을 수행해야합니다.행을 삽입하는 동안 난수 생성

+0

* 고유 * 난수가 필요합니까? 아니면 임의의 난수가 필요합니까? – gcbenison

답변

3

당신은 한 번에 하나 개의 행을 삽입하는 경우 ...

--INSERT dbo.table(column1, random_column) 
SELECT 'column1_value', 
    '11' + RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 3) 
     + RIGHT(REPLACE(CONVERT(VARCHAR(12), RAND()), '.', ''), 4); 

이 다중 행 SELECT의 일부인 경우, 각 행에 할당 같은 번호를 볼 수 있습니다, 그래서 당신이 필요할 것 각 행의 다른 데이터를 기반으로 랜덤 화 (또는 Conrad가 지적한대로 NEWID() 사용). 예

--INSERT dbo.table(column1, random_column) 
SELECT name, '11' + RIGHT(1000000 + ABS(CONVERT(BIGINT, 
    CONVERT(VARBINARY(16), NEWID()))), 7) 
FROM sys.all_objects; 

는 (나는 INSERT 그래서 당신이 독립적으로 결과를 테스트 할 수 있습니다 주석했습니다.) 이것은 당신에게 11 자리 임의의 숫자를 줄 것이다

+0

[newID에 기초한] (http://sqlfiddle.com/#!3/d41d8/1522) 랜덤 화를 시도했지만, 당신이 알고 있다고 확신합니다. –

+0

@ConradFrix 예, 이미 'NEWID()'와 함께 또 다른 대답이있었습니다. 약간 다른 접근 방식을 제공합니다. –

+0

나는 이것이 11 자리 숫자를 반환 할 것이라고 기대하지는 않았지만 점이 디지털 구분 기호 인 경우 +1 – Andomar

0

가능하지만 성능은 좋지 않습니다. 이 시도.

insert into table2(randomNumberColumn) 
select convert(bigint,'11' + convert(varchar(100),convert(bigint,right(convert(varchar(100),abs(convert(int,convert(varbinary(16),newid())))),7)))) as a 
from table1 

한 가지 문제는 11 자리 길이를 보장하지 않는다는 것입니다. 때로는 숫자가 작아서 10이됩니다. 난수 생성기가 작은 숫자로 나타날 때 추가 0을 채우는 방법을 실제로 살펴 보지 않았습니다.

+0

어떻게 구현할 것인가? 테이블에 삽입하려는 경우 어떻게할까요? – Grigor

+0

'Convert (varchar ('길이가 없습니까?이 게으른 구문을 홍보하지 마십시오.) http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar -without-length.aspx –

+0

@aaron은 조금 게으르지 만 게으르다. – Zhenny

1

PHP를 사용하십시오.

$randnum = "11".rand(1000000, 9999999);

은 그럼 그냥 쿼리 및 짜잔에서 그를 삽입합니다.

3

. 경우에 임의의 숫자는보다 짧은 9 자리 숫자가 제로로 시작되는, 그래서 전체 길이는 항상 11 :

select '11' + right('11000000000' + 
    cast(abs(convert(bigint,convert(varbinary(8),newid()))) as varchar(20)), 9) 
+0

실제로 11 자리 숫자로 연결됩니다 (OP는 9를 원합니다). :-) –

+0

+1 내 문제도 해결할 수 있습니다! – Zhenny

3

어쩌면이 지나치게 단순하지만 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) 무엇을 생산하는 매우 가볍고 방법이 될 것입니다 당신 필요.

그래서

ALTER TABLE mySchema.myTable ADD CONSTRAINT DF_myColumn 
DEFAULT 110000000 + (ABS(CHECKSUM(NEWID())) % 10000000) FOR myColumn 
+0

+1 조금 더 똑똑함 –

0

내가 시도 할 것 : 빨리 증명 중

SELECT '11'+RIGHT(STR(RAND(),9,7),7) 

SELECT '11'+REPLACE(STR(RAND(),9,7),'0.','') 

... 또는이 약간의 변화를 ... ....

+0

RAND()는 소수점 이하 자리가 충분하지 않기 때문에 항상이 솔루션을 사용하여 9 자리를 제공 할 수 없습니다. –

+0

@AaronBertrand 이것은 STRING이 RAND가 짧으면 다음 예제처럼 STRING이 후미 0을 제공하기 때문에 문제가되지 않습니다 :'SELECT '11'+ RIGHT (STR (0.25,9,7), 7)', 112500000' –