我想创建一个用户定义的函数,我的客户可以使用自己的架构在数据库上运行(它不会一直是dbo),例如:
IF OBJECT_ID (N'IsTest', N'FN') IS NOT NULL
DROP FUNCTION IsTest;
GO
CREATE FUNCTION IsTest (@Date datetime)
RETURNS int
AS
BEGIN
RETURN IsOcToday(@Date) -- *** This function is nested
END
和
IF OBJECT_ID (N'IsOcToday', N'FN') IS NOT NULL
DROP FUNCTION IsOcToday;
GO
CREATE FUNCTION IsOcToday (@Date datetime)
RETURNS int
AS
BEGIN
IF
(
(@Date >= CAST(GETDATE() AS DATE))
AND
(@Date < DATEADD(DAY,1, CAST(GETDATE() AS DATE)))
)
RETURN 1
RETURN 0
END
我知道在调用UDF时需要两个部分,但是有什么方法可以避免它或动态分配它。
调用顶级函数时,我可以找到模式并附加它,但我不能用嵌套函数来做。
答案 0 :(得分:1)
只有需要模式前缀的标量值函数。
改为将IsOcToday
重写为表值函数。
CREATE FUNCTION IsOcToday (@Date datetime)
RETURNS @T TABLE(Ret int)
AS
BEGIN
IF @Date >= CAST(GETDATE() AS DATE) AND
@Date < DATEADD(DAY,1, CAST(GETDATE() AS DATE))
BEGIN
INSERT INTO @T VALUES(1)
END
ELSE
BEGIN
INSERT INTO @T VALUES(0)
END
RETURN
END
并在IsTest
中更改您的使用方式。
CREATE FUNCTION IsTest (@Date datetime)
RETURNS int
AS
BEGIN
RETURN (SELECT Ret FROM IsOcToday(@Date))
END
如果您可以将函数重写为内联标量函数,那么几乎总是更好的选择。在你的情况下,函数将会是这样的。
CREATE FUNCTION IsOcToday (@Date datetime)
RETURNS TABLE AS RETURN
(
SELECT CASE WHEN @Date >= CAST(GETDATE() AS DATE) AND
@Date < DATEADD(DAY,1, CAST(GETDATE() AS DATE))
THEN 1
ELSE 0
END AS Ret
)