2015-04-16 6 views
7

Ho uno strano problema in MS SQL Server 2012. Sto cercando di verificare se una chiave esterna esiste già in uno script di aggiornamento. Ho usato la funzione di sistema OBJECT_ID() in passato per trovare tabelle, viste e procedure, ma quando provo a utilizzarla per trovare una chiave esterna non funziona.Perché non riesco a trovare una chiave esterna utilizzando la funzione OBJECT_ID()?

-- This query always returns null 
SELECT OBJECT_ID(N'FK_Name', N'F') 

-- This query works, returning the object ID for the foreign key 
SELECT object_id FROM sys.foreign_keys WHERE name=N'FK_Name' 

This SO risposta suggerisce che il mio OBJECT_ID() query dovrebbe funzionare.

risposta

10

Beh, potrebbe essere che la chiave esterna stia cercando la tabella non nello schema predefinito (probabilmente dbo). In questo caso non vedrete object_id fino a quando non si specifica dello schema, in questo modo:

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

In realtà, si potrebbe avere più oggetti con lo stesso nome nel database, ma all'interno di schemi diversi. OBJECT_ID(N'FK_Name', N'F') restituirà l'id dell'oggetto nello schema predefinito.

È possibile verificare in questo modo:

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') -- returns null 
select object_id('test.FK_temp', 'F') -- returns object id 

drop table test.temp2 
drop table test.temp1 
drop schema test 

sql fiddle demo

+0

Does fk hanno schema? –

+0

L'FK appartiene agli oggetti e gli oggetti appartengono allo schema –

+0

Mi sono perso qualcosa, perché -1? –