使用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)
答案 0 :(得分:0)
根据documentation of OBJECT_ID
,该函数仅搜索" schema scoped"的对象,即它们直接依赖于模式。您正在使用它来查询外键,该外键依赖于其基础表而不依赖于任何模式,因此永远不会找到它。
另一方面,第二个查询使用适当的视图来检查外键是否存在,如果它存在,它总是被找到。
事实上,MSDN几乎与您的代码有相同的代码,仅针对触发器:
重要
使用OBJECT_ID无法查询非架构范围的对象(如DDL触发器)。对于sys.objects目录视图中找不到的对象,请通过查询相应的目录视图来获取对象标识号。例如,要返回DDL触发器的对象标识号,请使用SELECT OBJECT_ID FROM sys.triggers WHERE name =' DatabaseTriggerLog``'。