2010-05-12 43 views
2

我希望有人可以幫助我,因爲谷歌沒有像我期望的那樣即將到來。我對SQL Server相對來說比較新,所以這是我自己設定的第一個功能。在電話號碼作爲參數創建SQL Server中的函數並返回一個隨機數

該函數的概要是它有一個電話號碼varchar(15)作爲參數,它檢查這個數字是否是一個合適的數字,即它是8位數字並且只包含數字。我試圖避免的主角是'+'。好號碼= 12345678錯誤號碼= +12345678。一旦檢查號碼,我想爲每個傳入的電話號碼產生一個隨機數。

我已經看過子字符串,like運算符,Rand(),left(),Right()以便搜索數字然後產生一個隨機數。我知道Rand()會產生相同的隨機數,除非對它做了修改,但現在它實際上是獲得一些工作代碼。對此的任何提示都會很棒,甚至可以指向更多的文檔。我在網上看過書,他們沒有幫助我,也許我沒有找到正確的地方。

下面是一個代碼片段,我工作的蘭德

declare @Phone Varchar (15) 
declare @Counter Varchar (1) 
declare @NewNumber Varchar(15) 
set @Phone = '12345678' 
set @Counter = len(@Phone) 

while @Counter > 0 
begin 
    select case when @Phone like '%[0-9]%' then cast(rand()*100000000 as int) else 'Bad Number' end 
    set @counter = @counter - 1 
end 
return 

感謝您的幫助提前

伊瑪

+0

ISNUMERIC是一個開始:http://msdn.microsoft.com/en-us/library/ms186272.aspx – 2010-05-12 02:27:15

+0

是輸入電話號碼應該是唯一的? – gbn 2010-05-12 04:12:35

+0

是的,輸入的電話號碼每次都是唯一的。感謝您的例子,我明天就會處理它,並讓您知道我將如何去。 – Emer 2010-05-12 06:10:30

回答

3

只需使用LIKE,並確保每一個數字是0和9之間

生成隨機數的一種方法是CHECKSUM(NEWID()),或將其用作RAND的種子

IF @phone LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 
    SELECT @NewNumber = LEFT(
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)) + 
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)) + 
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)), 15) 

或者雙負LIKE與長度檢查

IF @phone NOT LIKE '%[^0-9]%' AND LEN(@phone) = 8 
    SELECT @NewNumber = LEFT(
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)) + 
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)) + 
      CAST(ABS(CHECKSUM(NEWID())) AS varchar(10)), 15) 
1

我想我會更新我的職務與解決方案,我想出了其他人誰可能是尋找類似的東西。從我的研究中,您無法在UDF中使用RAND()。相反,您必須創建一個視圖並從該視圖調用它。

Create Function [dbo].[AlterPhone](@Phone Varchar(15)) 
Returns varchar (15) 
AS 
BEGIN 
declare @Counter int 
declare @NewNumber varchar(15) 
set @NewNumber = 0 

select @NewNumber = case when len(@Phone)=8 and isnumeric(@Phone) = 1 
then (select RandValue from dbo.vw_RandomVarchar) else 'Bad Number' end 
return @NewNumber 
END 

/* 
CREATE VIEW [dbo].[vw_RandomVarchar] 
AS 
    SELECT cast(cast(rand()*100000000 as int)as varchar) AS RandValue 

END 

SELECT dbo.AlterPhone(12345678) 
*/ 
相關問題