sql >> Databasteknik >  >> RDS >> Sqlserver

sql-server - skickar konstanter utan citationstecken till funktioner som DATEPART gör

Du kan egentligen inte begränsa inmatningen av en UDF till en liten uppsättning värden (såvitt jag vet).

Jag skulle rekommendera att skapa en tabell för dina uppräknade värden - ungefär så här:

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)

Naturligtvis är mitt exempel alltför förenklat, men du fattar.

Överväg också att göra funktionen till en tabellvärderad funktion av prestationsskäl, om du planerar att använda udf i set-satser. Jag bloggade om prestandakonsekvenserna av olika funktionstyper här:

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



  1. välj sökfråga i wordpress

  2. Hur kan jag kombinera flera rader till en kommaavgränsad lista i Oracle?

  3. Vad är det verkliga värdet av att ta in Microsoft Access i din organisation?

  4. Hur kan jag snabba upp denna SELECT CONCAT/GROUP BY-fråga?