OBJECT_ID无法找到主键

时间:2015-04-07 22:28:56

标签: sql-server

我有一个名为“PK_ABC.Sample”的主键,我试图找出它是否存在。出于某种原因,当我调用OBJECT_ID时,我一直变为null。为了快速测试,我将SQL更改为以下内容。

SELECT OBJECT_ID('PK_ABC.Sample') as 'Object Id'

我得到一个null结果,我理解这意味着两件事之一:它不存在或者我没有权限看到它。

检查sys.objects表我看到我有一个名为“PK_ABC.Sample”的条目,其object_id为123并输入“PK”。

运行相反的操作OBJECT_NAME(123)会产生正确的名称“PK_ABC.Sample”。

为什么我在运行OBJECT_ID时没有得到值123?

1 个答案:

答案 0 :(得分:2)

由于对象名称中的句点,您需要将名称括在括号中:

SELECT OBJECT_ID('[PK_ABC.Sample]');

我建议您按照常规标识(https://msdn.microsoft.com/en-us/library/ms175874.aspx)的规则命名对象,以避免此问题并简化维护。

修改

您添加了ABC是架构名称,因此如果不在默认架构中,则需要对名称进行架构限定:

SELECT OBJECT_ID(N'ABC.[PK_ABC.Sample]');

我怀疑有人不小心(重新)将约束命名为“PK_”,后跟模式限定的表名。这是多余的,因为表和列级约束隐含在与父表相同的模式中。目标名称可能是“PK_Sample”,它符合我之前提到的标识符命名。

可以使用重命名删除冗余架构名称和句点:

EXEC sp_rename N'ABC.[PK_ABC.Sample]', N'PK_Sample';

然后你可以获得没有括号和混淆的对象id:

SELECT OBJECT_ID(N'ABC.PK_Sample');