【问题标题】:IF (OBJECT_ID('FK', 'F') IS NOT NULL) doesn't work but IF EXISTS() does?IF (OBJECT_ID('FK', 'F') IS NOT NULL) 不起作用但 IF EXISTS() 起作用吗?
【发布时间】:2018-04-19 00:54:56
【问题描述】:

使用 SQL Server 2014,此查询似乎不起作用(即,不删除外键)

IF (OBJECT_ID('FK', 'F') IS NOT NULL)
BEGIN
    ALTER TABLE my_table 
    DROP CONSTRAINT [FK]
END

但是这个可以

IF EXISTS(
SELECT  *
FROM    sys.foreign_keys
WHERE   name = 'FK')
BEGIN
    ALTER TABLE my_table 
    DROP CONSTRAINT [FK]
END

我试图理解为什么。尤其是因为第一个查询确实有用。

运行此查询会返回带有外键的行(类型为F

select * from dbo.sysobjects o where o.type = 'F' and name = 'FK'

但运行它不会打印 找到外键 语句

IF (OBJECT_ID('FK', 'F') IS NOT NULL)
BEGIN
    PRINT 'Found foreign key'
END

cmets 中建议查询的结果

select LEN(name) as 'Len', CAST(name as varbinary(MAX)) as AsBinary, name from dbo.sysobjects o 
where o.type = 'F' and name = 'my_fk_name'

给我

108 | 0x46004B005F0049........006F006E0049006400 | my_fk_name

select id from dbo.sysobjects o 
where o.type = 'F' and name = 'my_fk_name'

select OBJECT_NAME(TheObjectId)

给我

my_fk_name

【问题讨论】:

  • 您只是缺少对象类型参数。试试 IF (OBJECT_ID('FK', 'F') IS NOT NULL....
  • @EricBrandt 对不起,我的查询中有这个。 Ctrl+c,Ctrl+v错误。
  • 嗯。行。当您说查询曾经有效时,您是什么意思?也许对此了解更多会指出一些事情。
  • 可能与权限问题有关吗?登录是否有受限权限?
  • @MoeSisko Nah,我在我的登录名下运行它,它具有系统管理员访问权限

标签: sql sql-server tsql


【解决方案1】:

根据documentation of OBJECT_ID,该函数仅搜索“模式范围”的对象,即它们直接依赖于模式。您正在使用它来查询外键,该外键取决于其基础表而不是任何架构,因此永远不会找到它。

另一方面,第二个查询使用适当的视图来检查外键是否存在,如果存在,则始终可以在其中找到它。

事实上,MSDN 有几乎与您完全相同的代码作为此行为的示例,只是用于触发器:

重要

不能使用 OBJECT_ID 查询非架构范围的对象,例如 DDL 触发器。对于未在 sys.objects 目录视图中找到的对象,请通过查询相应的目录视图来获取对象标识号。例如,要返回 DDL 触发器的对象标识号,请使用 SELECT OBJECT_ID FROM sys.triggers WHERE name = 'DatabaseTriggerLog``'。

【讨论】:

  • 如果您进一步阅读文档,您会发现外键是一种可接受的对象类型 (docs.microsoft.com/en-us/sql/relational-databases/…)。
  • 我的意思是 OBJECT_ID 以前确实为我工作过。另外,如果您查看this one 之类的问题,OBJECT_ID 似乎是执行此操作的“推荐”方式。想法?
  • 您应该指定 FK 的架构。查看语法:OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] object_name' [ ,'object_type' ] )
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
相关资源
最近更新 更多