create function dbo.dj(@inputcj int)returns varchar(10)
as
begin
declare @restr varchar(10)
if @inputcj<60
set @restr='未通过'
else
set @restr='通过'
return @restr
endselect dbo.dj(80)后面的   select dbo.dj(80)    为什么查询一定要加dbo.   直接用select dj(80)   确要出错呢

解决方案 »

  1.   

    SQLSERVER要求在调用函数时,只有返回表值的函数可以不加所有者,否则必须加所有者名称,具体请参阅CREATE FUNCTION帮助.所以这又是一个我们要遵守的规则.
    至于所有者是不是都是dbo,要看创建这个函数的用户是谁,在这一点上函数与表或存储过程没有任何区别,也就是说所有者就是创建她的用户.
    我们常见的dbo是指以sa(SQLSERVER登录方式)或windows administration(Windows集成验证登录方式)登录的用户,也就是说数据库管理员在SQLSERVER中的用户名就叫dbo,而不叫sa,这一点看起来有点蹊跷,因为通常用户名与登录名相同(不是强制相同,但为了一目了然通常都在创建用户名时使用与登录名相同的名字),例如创建了一个登录,名称为me,那么可以为该登录名me在指定的数据库中添加一个同名用户,使登录名me能够访问该数据库中的数据.当在数据库中添加了一个用户me后,之后以me登录名登录时在该数据库中创建的一切对象(表,函数,存储过程等)的所有者都为me,如db.me.table1,db.me.fn_test(),而不是dbo.
    不管怎样,只要记住了sa这个登录名对应的用户名是dbo而不是sa就行了.
    另外,不要混淆登录名与用户名.登录名只是具有连接到SQLSERVER的权限,而没有访问SQLSERVER上数据库的权限,所以要为该登录名在指定的数据库中创建用户名,使其可以访问那个数据库中的数据.一个登录名可以在多个数据库中创建用户名,以使这个登录名能够访问多个数据库(在登录连接的字符串中指定默认的数据库名称),但是一个登录名在一个数据库中只能创建一个对应的用户名,也就是说me登录名在pubs数据库(举例)只能创建一个用户名.
    比喻一下:SQLSERVER就象一栋大楼,里面的每个房间都是一个数据库.登录名只是进入大楼的钥匙,而用户名则是进入房间的钥匙.一个登录名可以有多个房间的钥匙.SQLSERVER把登录名与用户名的关系称为映射.
    至于为什么要使用所有者进行限定,是因为不同的用户可能创建同名的对象,例如登录名me和登录名you在pubs数据库中分别创建了用户名me,和you,这二个用户都创建了testtable这个同名表,而这二个表虽然同名但结构或数据可能完全不同,为了避免调用错误,必须使用所有者名称进行限定.
    还有,怎样来调用别的用户创建的对象呢?例如me用户访问you用户创建的表或访问dbo创建的表.此种情况,必须同时满足二个条件:
    1.将me用户的数据库角色设置为db_owner,否则无法访问其他用户(包括dbo用户)创建的对象.(企业管理器->用户,右键菜单<属性>中设置)
    2.使用所有者进行限定.
    例如me访问you创建的testtable:
    select * from you.testtable
    另外,dbo用户作为管理员,系统赋予其所有的权限,可以调用任何用户创建的对象.
    如果具有db_owner角色的用户在访问对象时省略了所有者,则系统先查找该用户的对象,若找不到则查找dbo用户是否有同名对象.例如:
    select * from testtable  或
    select * from pubs..testtable
      

  2.   

    标准语法约定,都需要加上所有者(dbo.)
    标量函数就强制约定
    表函数为非强制约定