sql >> Base de Datos >  >> RDS >> Sqlserver

servidor sql:pasar constantes sin comillas a funciones como lo hace DATEPART

Realmente no puede restringir la entrada de un UDF a un pequeño conjunto de valores (que yo sepa).

Recomendaría crear una tabulación para los valores enumerados, algo como esto:

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)

Por supuesto, mi ejemplo está demasiado simplificado, pero entiendes la idea.

Además, considere hacer que la función sea una función con valores de tabla por razones de rendimiento, si planea usar udf en declaraciones de conjunto. Escribí en un blog sobre las implicaciones de rendimiento de varios tipos de funciones aquí:

http://thehobt.blogspot.com/2009 /02/funciones-escalares-vs-valores-de-tabla.html