Создание функции в SQL Server с номером телефона в качестве параметра и возвращением случайного числа - PullRequest
2 голосов
/ 12 мая 2010

Я надеюсь, что кто-то может помочь мне здесь, поскольку Google не так готов, как мне бы хотелось. Я относительно новичок в SQL Server, и поэтому это первая функция, которую я сам поставил перед собой.

Суть функции заключается в том, что в качестве параметра указан номер телефона varchar (15), он проверяет, является ли этот номер правильным номером, то есть он имеет длину 8 цифр и содержит только цифры. Главный герой, которого я стараюсь избегать, это «+». Хороший номер = 12345678 Плохой номер = +12345678. После проверки номера я хотел бы создать случайное число для каждого переданного телефонного номера.

Я посмотрел на подстроки, оператор like, Rand (), left (), Right (), чтобы найти число и затем получить случайное число. Я понимаю, что Rand () будет выдавать одно и то же случайное число, если в него не будут внесены изменения, но сейчас речь идет о фактическом получении некоторого рабочего кода. Любые намеки на это были бы хороши или даже указали бы мне на некоторую дополнительную документацию. Я читал книги в Интернете, и они не помогли мне, может быть, я не смотрю в нужных местах.

Вот фрагмент кода, над которым я работал над 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 

Заранее спасибо за помощь

Эмер

Ответы [ 2 ]

3 голосов
/ 12 мая 2010

Просто используйте 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 голос
/ 20 мая 2010

Я думал, что обновлю свой пост предложенным мною решением для других людей, которые могут искать что-то подобное. Из моего исследования вы не можете использовать RAND () в UDF. Вместо этого вы должны создать представление и вызвать его из этого представления.

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)
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...