为什么我无法使用OBJECT_ID()函数找到外键?

17 浏览
0 Comments

为什么我无法使用OBJECT_ID()函数找到外键?

我在MS SQL Server 2012中遇到了一个奇怪的问题。我正在尝试在升级脚本中检查外键是否已经存在。过去我曾使用系统的OBJECT_ID()函数来查找表、视图和存储过程,但是当我尝试使用它来查找外键时却无法工作。

-- 这个查询总是返回null
SELECT OBJECT_ID(N'FK_Name', N'F')
-- 这个查询可以正常工作,返回外键的对象ID
SELECT object_id FROM sys.foreign_keys WHERE name=N'FK_Name'

这个SO回答建议我的OBJECT_ID()查询应该可以工作。

0
0 Comments

为什么使用OBJECT_ID()函数找不到外键?

可能是因为您的外键所指向的表不在默认模式(可能是dbo)中。在这种情况下,除非指定模式,否则您将无法看到object_id,像这样:

SELECT OBJECT_ID(N'<schema>.FK_Name',N'F')

实际上,您的数据库中可能有多个具有相同名称的对象,但位于不同的模式中。OBJECT_ID(N'FK_Name',N'F')将返回默认模式中对象的ID。

您可以像这样进行测试:

create schema test

create table test.temp1(id int primary key)

create table test.temp2(id int)

go

alter table test.temp2 add constraint FK_temp foreign key(id)references test.temp1(id)

select object_id('FK_temp','F') - 返回空值

select object_id('test.FK_temp','F') - 返回对象ID

drop table test.temp2

drop table test.temp1

drop schema test

FK属于对象,对象属于模式

我有什么遗漏的吗,为什么会是-1?

您是绝对正确的!在FK名称之前添加模式修复了它。谢谢!

这篇文章中要补充的一件事是,如果外键名称包含句点(.)字符,则必须将模式和名称放在方括号中,即[schema].[name]

0