Sql server 手动调用函数的方法->;选择还是执行?

Sql server 手动调用函数的方法->;选择还是执行?,sql-server,Sql Server,为什么在使用SELECT时必须使用带有标量函数的模式(dbo.xxx),而在使用EXEC时则不能使用 DECLARE @ReplicationGroup nvarchar(255) = 'Replication Configuration'; SELECT dbo.fnGetReplicationGroupID(@ReplicationGroup) -- Works but I have to keep dbo. EXEC fnGetReplicationGroupID @Replication

为什么在使用SELECT时必须使用带有标量函数的模式(dbo.xxx),而在使用EXEC时则不能使用

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有:标量、表值和多语句表值。标量函数可以在任何允许标量表达式的地方以及在
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
从语法上讲,在调用函数时指定括号(如果没有参数,则为空),and
EXECUTE
语句除外。参数不使用
EXECUTE
指定,参数(如果有)作为命名或位置参数提供,就像执行存储过程时一样

我不经常看到在野外使用
EXECUTE
调用标量函数,因为人们总是可以使用
SELECT

编辑

根据文档,有必要(至少)使用由两部分组成的名称对标量函数进行模式限定。至于为什么这是必要的,我认为这是为了避免与可能具有相同名称的系统函数之间的歧义。

SQL Server有:标量、表值和多语句表值。标量函数可以在任何允许标量表达式的地方以及在
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
从语法上讲,在调用函数时指定括号(如果没有参数,则为空),and
EXECUTE
语句除外。参数不使用
EXECUTE
指定,参数(如果有)作为命名或位置参数提供,就像执行存储过程时一样

我不经常看到在野外使用
EXECUTE
调用标量函数,因为人们总是可以使用
SELECT

编辑


根据文档,有必要(至少)使用由两部分组成的名称对标量函数进行模式限定。至于为什么这是必要的,我认为这是为了避免对可能具有相同名称的系统功能产生歧义。

我试图再问一个后续问题,但它说..只能通知一个额外的@用户;帖子的所有者永远都是notified@SunMan考虑将额外的问题添加到原来的文章中。似乎查询问题包含了一个at标志,在评论中被解释为用户引用。啊。。我明白了…好的,让我粘贴到这里。我想再问一个后续问题,但上面说..只能通知一个额外的@用户;帖子的所有者永远都是notified@SunMan考虑将额外的问题添加到原来的文章中。似乎查询问题包含了一个at标志,在评论中被解释为用户引用。啊。。我明白了……好吧,让我贴在那里