是否可以创建嵌套的tsql函数来更改模式?

时间:2013-11-28 21:40:15

标签: sql-server tsql nested

我想创建一个用户定义的函数,我的客户可以使用自己的架构在数据库上运行(它不会一直是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时需要两个部分,但是有什么方法可以避免它或动态分配它。

调用顶级函数时,我可以找到模式并附加它,但我不能用嵌套函数来做。

1 个答案:

答案 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
)

SQL Fiddle