我最近开始为各种MCSE:BI考试做一些研究。在这样做的过程中,我遇到了以前没有使用过的SQL Server方面。双点符号不是我用过的东西,所以这个场景让我觉得有些奇怪。
我的用户的默认架构为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。我遇到了一些关于如何解决命名问题的讨论,但我没有看到任何提及这种“限制”的内容。既然我可以调用一个过程,或者从表中选择,使用双点表示法,为什么我不能以类似的方式调用函数?
答案 0 :(得分:1)
SQL Server must be prefixed by a schema identifier中的标量UDF。虽然我找不到具体的理由,但我推测它是为了减少内在函数(ISNULL
等)和UDF之间的混淆和名称空间冲突。
这样做的结果是,双点表示法(您指定数据库但使用该数据库的默认架构)将不适用于UDF。