IF(OBJECT_ID('FK','F')是非空)不起作用,但IF EXISTS()有效吗?

时间:2018-04-19 00:54:56

标签: sql sql-server tsql

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

mvn package

java -cp target/coolproject-1.0.0-SNAPSHOT-jar-with-dependencies.jar com.mycompany.Process

但这个确实

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

但是运行它不会打印 Found外键语句

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

给了我

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)

1 个答案:

答案 0 :(得分:0)

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

另一方面,第二个查询使用适当的视图来检查外键是否存在,如果它存在,它总是被找到。

事实上,MSDN几乎与您的代码有相同的代码,仅针对触发器:

  

重要

     

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

相关问题