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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top