2012-06-06 73 views
0

我想要將數據插入到名爲accounts的表中,並且其中一個字段必須有一個隨機數,從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這樣你就可以進行獨立測試結果。)

+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('without length?Please not promote this lazy syntax。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

這將會給你一個11位的隨機數。如果隨機數少於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'+REPLACE(STR(RAND(),9,7),'0.','') 

...或者這個微小的變化...

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

...取其證明更快。

+0

RAND()有時在小數位後沒有足夠的數字,所以你不能依靠這個解決方案來總是提供9位數字。 –

+0

@AaronBertrand這不是問題,因爲如果RAND很短,STR將提供尾隨零,如下例所示:'SELECT'11'+ RIGHT(STR(0.25,9,7),7)',返回' 112500000' –