使用双点符号调用函数会产生语法错误
Calling function using double dot notation yields syntax error
我最近开始为各种 MCSE:BI 考试做一些学习。在这样做的过程中,我遇到了以前从未使用过的 SQL 服务器的各个方面。双点符号我用得不多,所以这个场景让我觉得有点奇怪。
我的用户的默认架构是 dbo
,下面的所有对象都在 dbo
下创建。
给定以下示例:
use laboratory
create table tbl_simple_test(SimpleTestID int identity(1,1), SomeVal varchar(255))
go
insert tbl_simple_test
select 'test value 1'
go
create procedure usp_simple_procedure
AS
BEGIN
select 1
END
go
create function fn_simple_function()
Returns int
AS
BEGIN
Declare @Result int
select @Result = 1
return @Result
END
go
select * from laboratory.dbo.tbl_simple_test
--returns record we inserted above
select * from laboratory..tbl_simple_test
--returns record we inserted above
exec laboratory.dbo.usp_simple_procedure
--returns 1
exec laboratory..usp_simple_procedure
--returns 1
select laboratory.dbo.fn_simple_function()
--returns 1
select laboratory..fn_simple_function()
--syntax error
我在 SO 上进行了一些谷歌搜索。我遇到了一些关于如何解决命名的讨论,但我没有看到任何提及此 "limitation" 的内容。既然我可以使用双点符号从 table 调用过程或 select,为什么我不能以类似的方式调用函数?
SQL 服务器 must be prefixed by a schema identifier 中的标量 UDF。虽然我找不到具体的理由,但我推测这是为了减少内部函数(ISNULL
等)和 UDF 之间的混淆和命名空间冲突。
这样做的结果是双点表示法(您指定数据库但使用该数据库的默认模式)不适用于 UDF。
我最近开始为各种 MCSE:BI 考试做一些学习。在这样做的过程中,我遇到了以前从未使用过的 SQL 服务器的各个方面。双点符号我用得不多,所以这个场景让我觉得有点奇怪。
我的用户的默认架构是 dbo
,下面的所有对象都在 dbo
下创建。
给定以下示例:
use laboratory
create table tbl_simple_test(SimpleTestID int identity(1,1), SomeVal varchar(255))
go
insert tbl_simple_test
select 'test value 1'
go
create procedure usp_simple_procedure
AS
BEGIN
select 1
END
go
create function fn_simple_function()
Returns int
AS
BEGIN
Declare @Result int
select @Result = 1
return @Result
END
go
select * from laboratory.dbo.tbl_simple_test
--returns record we inserted above
select * from laboratory..tbl_simple_test
--returns record we inserted above
exec laboratory.dbo.usp_simple_procedure
--returns 1
exec laboratory..usp_simple_procedure
--returns 1
select laboratory.dbo.fn_simple_function()
--returns 1
select laboratory..fn_simple_function()
--syntax error
我在 SO 上进行了一些谷歌搜索。我遇到了一些关于如何解决命名的讨论,但我没有看到任何提及此 "limitation" 的内容。既然我可以使用双点符号从 table 调用过程或 select,为什么我不能以类似的方式调用函数?
SQL 服务器 must be prefixed by a schema identifier 中的标量 UDF。虽然我找不到具体的理由,但我推测这是为了减少内部函数(ISNULL
等)和 UDF 之间的混淆和命名空间冲突。
这样做的结果是双点表示法(您指定数据库但使用该数据库的默认模式)不适用于 UDF。