2 Stimmen

Eine Funktion in SQL Server erstellen, die eine Telefonnummer als Parameter akzeptiert und eine Zufallszahl zurückgibt

Ich hoffe, jemand kann mir hier helfen, da Google nicht so auskunftsfreudig ist, wie ich es gerne hätte. Ich bin relativ neu in SQL Server und das ist die erste Funktion, die ich mir vorgenommen habe zu machen.

Der Entwurf der Funktion ist, dass sie eine Telefonnummer Varchar(15) als Parameter hat, überprüft, dass diese Nummer eine richtige Nummer ist, d.h. sie besteht aus 8 Ziffern und enthält nur Zahlen. Das Hauptzeichen, das ich vermeiden möchte, ist '+'. Gute Nummer = 12345678 Schlechte Nummer = +12345678. Nachdem die Nummer überprüft wurde, möchte ich für jede übergebene Telefonnummer eine Zufallszahl erzeugen.

Ich habe mir Substrings, den Like-Operator, Rand(), left(), Right() angesehen, um durch die Nummer zu suchen und dann eine Zufallszahl zu erzeugen. Ich verstehe, dass Rand() die gleiche Zufallszahl erzeugen wird, es sei denn, es werden Änderungen daran vorgenommen, aber im Moment geht es darum, tatsächlich einige funktionierende Codes zu bekommen. Hinweise dazu wären großartig oder zeigen Sie mir sogar auf einige weitere Dokumentationen hin. Ich habe Online-Bücher gelesen und sie haben mir nicht geholfen, vielleicht suche ich an den falschen Stellen.

Hier ist ein Ausschnitt des Codes, an dem ich mit dem Rand gearbeitet habe

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 'Schlechte Nummer' end
   set @counter = @counter - 1
end
return 

Danke im Voraus für die Hilfe

Emer

3voto

gbn Punkte 407102

Verwenden Sie einfach LIKE und stellen Sie sicher, dass jede Ziffer zwischen 0 und 9 liegt.

Ein Weg, um Zufallszahlen zu generieren, ist CHECKSUM(NEWID()), oder verwenden Sie dies als Seed für 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)

Oder das doppelte Negativ von LIKE mit Längenprüfung

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)

1voto

Emer Punkte 31

Ich dachte, ich würde meinen Beitrag mit der Lösung aktualisieren, die ich für andere Personen entwickelt habe, die nach etwas Ähnlichem suchen. Aus meiner Recherche geht hervor, dass Sie RAND() innerhalb einer UDF nicht verwenden können. Stattdessen müssen Sie eine Ansicht erstellen und diese aus dieser Ansicht aufrufen.

Erstellen Sie die Funktion [dbo].[AlterPhone](@Phone Varchar(15))
Gibt varchar (15) zurück
ALS 
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 'Falsche Nummer' end
return @NewNumber
END

/*
ERSTELLEN SIE DIE SICHT [dbo].[vw_RandomVarchar]
ALS
  SELECT cast(cast(rand()*100000000 as int)as varchar) AS RandValue

END

SELECT dbo.AlterPhone(12345678)
*/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X