Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

sql server - passaggio di costanti non quotate a funzioni come fa DATEPART

Non puoi davvero vincolare l'input di un UDF a un piccolo insieme di valori (per quanto ne so).

Consiglierei di creare una scheda per i valori enumerati, qualcosa del genere:

CREATE TABLE MyEnumTable (DatePartID tinyint, DatePartValue char(2))
GO
INSERT MyEnumTable(DatePartID, DatePartValue)
SELECT 1, 'yy'
UNION
SELECT 2, 'mm'
UNION
SELECT 3, 'dd'
UNION
SELECT 4, 'hh'
GO

CREATE FUNCTION MyDatePart(@IntervalType tinyint)
RETURNS varchar(255)
AS
BEGIN
IF NOT EXISTS (SELECT * FROM MyEnumTable WHERE DatePartID = @IntervalType)
   RETURN 'Invalid IntervalType'

--Do your stuff
DECLARE @DatePartvalue char(2)
SELECT  @DatePartValue = DatePartValue
FROM    MyEnumTable
WHERE   DatePartID = @IntervalType

RETURN @DatePartValue
END

GO

--Check it out
SELECT dbo.MyDatePart(3), dbo.MyDatePart(12)

Certo, il mio esempio è troppo semplificato, ma hai un'idea.

Inoltre, considera di rendere la funzione una funzione con valori di tabella per motivi di prestazioni, se hai intenzione di utilizzare udf nelle istruzioni set. Ho scritto sul blog sulle implicazioni sulle prestazioni di vari tipi di funzione qui:

http://thehobt.blogspot.com/2009 /02/funzioni-scalari-vs-valore-tabella.html