Come posso scrivere una funzione definita dall'utente?
-
22-07-2019 - |
Domanda
Vorrei scriverlo come una funzione definita dall'utente:
private double Score(Story s){
DateTime now = DateTime.Now;
TimeSpan elapsed = now.Subtract(s.PostedOn);
double daysAgo = elapsed.TotalDays;
return s.Votes.Count + s.Comments.Count - daysAgo;
}
È possibile farlo con un UDF?
Soluzione
Puoi, ma se stai usando SQL Server 2000, dovrai passare il valore di " now " - Gli UDF non possono generare da soli alcun valore non deterministico in SQL Server 2000 .
Questa pugnalata non testata potrebbe essere vicina:
CREATE FUNCTION dbo.GetStoryScore (
@Now DATETIME, @Posted DATETIME, @Votes INT, @Comments INT
) RETURNS FLOAT AS
BEGIN
RETURN @Votes + @Comments - DATEDIFF(HOUR, @Posted, @Now)/24.0
END
Esempio di utilizzo:
SELECT S.ID, dbo.GetStoryScore(GETDATE(), S.Posted, S.Votes, S.Comments) AS Score
FROM Stories AS S
WHERE ...
Note:
-
Il datiff viene eseguito in ore (non giorni) perché il risultato intero ti dà un po 'più di precisione quando usi unità più fini.
-
Ho inserito tutti i valori perché ho trovato che le ricerche all'interno delle funzioni erano davvero pessime per le prestazioni.
-
Se indicato in SQL, non dimenticare il
dbo.
davanti al nome della funzione. -
Se si utilizza SQL Server 2005, è possibile rimuovere la variabile @Now e utilizzare invece GETDATE () in linea.
Altri suggerimenti
Immagino qualcosa di simile al seguente:
CREATE FUNCTION [dbo].[Score]
(@storyid int)
RETURNS float
AS
BEGIN
DECLARE @ret float;
DECLARE @elapsed float;
SELECT @elapsed = DATEDIFF(n, getdate(), postedon) / 1440
FROM stories WHERE storyid = @storyid;
SET @ret = ((SELECT count(voteid) FROM votes WHERE storyid = @storyid) +
(SELECT count(commentid) FROM comments WHERE storyid = @storyid) -
@elapsed);
RETURN @ret;
END