SQL Server - передача констант без кавычек в функции, подобные DATEPART - PullRequest
4 голосов
/ 11 июня 2009

Я хотел бы создать функцию, которая принимает константу как функция datepart принимает yy/mm/dd/hh/

как:

выберите часть даты (dd, getdate ())

Я хотел бы создать свою собственную функцию, которая принимает dd не символ как 'dd'

я хочу

выберите MyFunc (dd, getdate ())

а не

выберите MyFunc ('dd', getdate ())

Ответы [ 2 ]

1 голос
/ 11 июня 2009

Вы не можете реально ограничить ввод UDF небольшим набором значений (насколько мне известно).

Я бы порекомендовал создать табу для ваших перечисляемых значений - что-то вроде этого:

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)

Конечно, мой пример упрощен, но вы поняли.

Кроме того, рассмотрите возможность сделать функцию табличной функцией из соображений производительности, если вы планируете использовать udf в операторах set. Я писал о влиянии на производительность различных типов функций здесь:

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

0 голосов
/ 11 июня 2009

Я хотел бы создать свою собственную функцию, которая принимает dd not char как 'dd'

Я думаю, тебе не повезло в этом. Если вы не заключите одинарные кавычки в символы, они будут интерпретированы как имя, но вы не можете определить их как имя где-либо, если хотите, чтобы они использовались так, как вы предлагаете.

...