Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

serveur sql - transmission de constantes sans guillemets à des fonctions comme le fait DATEPART

Vous ne pouvez pas vraiment limiter l'entrée d'un UDF à un petit ensemble de valeurs (à ma connaissance).

Je recommanderais de créer un tableau pour vos valeurs énumérées - quelque chose comme ceci :

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)

Bien sûr, mon exemple est trop simplifié, mais vous voyez l'idée.

Envisagez également de faire de la fonction une fonction table pour des raisons de performances, si vous prévoyez d'utiliser l'udf dans les instructions set. J'ai blogué sur les implications en termes de performances de divers types de fonctions ici :

http://thehobt.blogspot.com/2009 /02/scalar-functions-vs-table-valued.html