Sql server 是否可以创建用于更改架构的嵌套tsql函数?

Sql server 是否可以创建用于更改架构的嵌套tsql函数?,sql-server,tsql,nested,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 及 如果对

我想创建一个用户定义的函数,我的客户可以使用他们自己的模式在数据库上运行(它不总是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

如果对象ID(N'IsOcToday',N'FN')不为空
今天就放弃功能;
去
今天创建函数(@Date-datetime)
返回整数
作为
开始
如果
(
(@Date>=CAST(GETDATE()作为日期))
及
(@Date
我知道在调用UDF时需要两个部分,但是否有任何方法可以避免它或动态分配它


调用顶级函数时,我可以找到模式并将其追加,但嵌套函数无法做到这一点。

只有标量值函数需要模式前缀

重写为表值函数

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
如果可以将函数重写为内联标量函数,那么这几乎总是更好的选择。在您的例子中,函数将改为如下所示

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
)
今天创建函数(@Date-datetime)
返回表作为返回
(
选择@Date>=CAST时的CASE(GETDATE()作为日期)并
@日期<日期添加(日期,1,强制转换(GETDATE()作为日期))
那么1
其他0
以Ret结束
)

只有标量值函数需要模式前缀

重写为表值函数

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
如果可以将函数重写为内联标量函数,那么这几乎总是更好的选择。在您的例子中,函数将改为如下所示

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
)
今天创建函数(@Date-datetime)
返回表作为返回
(
选择@Date>=CAST时的CASE(GETDATE()作为日期)并
@日期<日期添加(日期,1,强制转换(GETDATE()作为日期))
那么1
其他0
以Ret结束
)

不清楚您想要做什么。一个解决方案是创建一个架构(例如
Common
),其中将包含
isotoday
函数。然后,每个客户都可以调用此函数(例如,
SELECT Common.IsOcToday()
)。其中一个问题可能是我需要向用户提供“授予架构”权限,这将使用户无法在没有dbo权限时安装函数。您可以使用
同义词
重定向到嵌套函数(取决于SQL Server版本)-但我认为许可证也会有同样的问题。我们不清楚您想要做什么。一个解决方案是创建一个模式(例如,
Common
),该模式将包含
isotoday
函数。然后,每个客户都可以调用此函数(例如,
SELECT Common.IsOcToday()
)。其中一个问题可能是我需要向用户提供“授予架构”权限,这将使用户无法在没有dbo权限时安装函数。您可以使用
同义词
重定向到嵌套函数(取决于SQL Server版本)-但我认为权限也会有同样的问题。使用表进行数据操作功能不会造成性能损失吗?@Samuel根据经验法则,与其他两个不好甚至非常糟糕的函数相比,内联表值函数的性能更好,这取决于您如何使用它们。你必须进行测试才能确定你的情况如何。如果你能展示一些你实际使用的代码,我也可以做一些测试,向你展示你的函数是如何工作的,有哪些替代方案以及如何工作的。使用表进行数据操作功能难道没有性能损失吗?@Samuel根据经验,可以说内联表值函数在性能方面比其他两个差,甚至非常差的函数好,这取决于您如何使用它们。您必须进行测试,以确定在您的情况下它是如何工作的。如果您可以展示一些您实际使用的代码,我也可以对其进行测试,并向您展示您的函数将如何工作以及有哪些替代方案以及如何工作。