手动调用函数的用途是什么 - > SELECT 或 EXEC?



为什么在使用select而不是使用exec时,我必须使用标量函数的架构(dbo.xxx)使用?

DECLARE @ReplicationGroup nvarchar(255) = 'Replication Configuration';
SELECT dbo.fnGetReplicationGroupID(@ReplicationGroup) -- Works but I have to keep dbo.
EXEC fnGetReplicationGroupID @ReplicationGroup -- Works without dbo.
select dbo.fnIsDebugLoggingEnabled(); -- Works but I have to keep dbo.
EXEC fnIsDebugLoggingEnabled  -- Works without dbo.

SQL Server具有3种不同类型的功能:标量,表值和多态表值。标量函数可以在允许标量表达式以及EXECUTE语句中使用。可以在允许表值表达式的地方使用表值函数和多态表值值函数,不包括EXECUTE语句。示例:

CREATE FUNCTION dbo.fnScalarFunctionExample(@value int)
RETURNS bit
AS 
BEGIN
    RETURN @value;
END;
GO
CREATE FUNCTION dbo.fnInlineTableValuedFunction (@value int)  
RETURNS TABLE  
AS  
RETURN   
(  
    SELECT @value AS Value  
);  
GO  
CREATE FUNCTION dbo.fnMultiStatementTableValuedFunction (@value int)  
RETURNS @Table TABLE   
(  
    Value int NOT NULL  
)  
AS  
BEGIN  
    INSERT INTO @Table VALUES(@value);
    RETURN;
END;
GO
--scalar functions can be called with EXEC or wherever in a scalar experession is permitted
DECLARE @ReturnValue int;
EXEC @ReturnValue = dbo.fnScalarFunctionExample 1;
PRINT @ReturnValue;
GO
SELECT dbo.fnScalarFunctionExample(1);
GO
SELECT 1 WHERE dbo.fnScalarFunctionExample(1) = 1;
GO
--table-valued functions are invoked from a SELECT query
SELECT * FROM dbo.fnInlineTableValuedFunction(1);
SELECT * FROM dbo.fnMultiStatementTableValuedFunction(1);  
GO

语法上,您指定括号(如果没有参数,则没有参数),并在使用和EXECUTE语句的情况下指定功能。parens并未用EXECUTE指定,并且参数(如果有的话)如执行存储过程时以命名或位置参数提供。

我通常不会看到野外EXECUTE调用的标量功能,因为人们可以始终使用SELECT

编辑

必须(至少)(至少)根据文档使用2部分名称(至少)架构质量标量函数。至于为什么有必要,我认为这是为了避免使用可能具有相同名称的系统函数的歧义。

最新更新