SCHEMA_NAME()返回NULL

3

我正在一个T-SQL脚本中使用SCHEMA_NAME()函数。

对于我的同事来说,它返回默认模式,但对我来说返回NULL

SCHEMA_NAME()的文档仅在向该函数提供参数时列出了NULL作为可能的值。

以下是关于SCHEMA_NAME()的文档: https://learn.microsoft.com/en-us/sql/t-sql/functions/schema-name-transact-sql

调试此问题时应注意哪些内容?

DBA已经检查了我的权限和同事的权限是否相同。

我没有传递任何参数调用该函数,因此文档中提到的当schema_id无效时返回NULL的情况并不适用,至少没有明确地适用。

DBA确认我有一个默认模式,并且我使用了以下选择来确认:

select * from sys.database_principles dp where dp.name = USER_NAME();

DBA将我的默认架构更改为其他内容,然后在后台设置了某些内容后又将其更改回来。这种情况发生在SQL Studio中以及使用sqlcmd从命令行运行时。
我注意到当我运行CREATE PROCEDURE myproc时,该过程创建在我的默认模式中,但当我运行execute myproc时,我需要执行execute myschema.myproc。也就是说:我必须指定模式。
我已经验证了默认模式的存在,通过在调用存储过程时硬编码模式名称。

当schema_id不是有效的ID时,返回NULL。现在我们怎么知道您是否向函数提供了有效的ID呢? - Tab Alleman
选项卡 - 我认为迈克尔正在使用没有参数的函数。我刚试过了,结果是“dbo”。抱歉迈克尔,我不知道这里可能出了什么问题! - Brett
2
如果未定义schema_id,则SCHEMA_NAME将返回调用者的默认模式名称。您的登录是否设置了有效的默认模式? - Tab Alleman
你是在管理工作室中运行脚本还是以编程方式运行? - slesh
你是否验证了默认模式实际存在?如果不存在,SCHEMA_NAME()将返回NULL - Dan Guzman
3个回答

2
这也可能发生在您对不同于schema_id的数据库执行查询时。
例如:
select sn = schema_name(schema_id) from [yourdbname].sys.all_objects 

并且当前数据库不是 [yourdbname]


1

我也遇到了Schema_name()返回null值的同样问题,但sys.database_principal显示默认模式为我的用户名,然后我注意到DBA团队已删除模式(用户名)。当他们重新创建相同的模式时,我的问题得到解决。您可以使用sys.schemas检查数据库中模式的列表。


0
在“安全性>登录”中,右键单击您的登录名,点击“用户映射”,查看当前数据库的默认架构。然后重复此步骤以查询你同事的默认架构。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接