É seguro usar OBJECT_ID() como referência em suas próprias tabelas, supondo que o valor sempre se referirá ao mesmo objeto de banco de dados, não importa o quê?
O msdn afirma
Todas as funções de metadados são não determinísticas. Isso significa que essas funções nem sempre retornam os mesmos resultados toda vez que são chamadas, mesmo com o mesmo conjunto de valores de entrada.
então isso indicaria que não é seguro, mas não consegui encontrar nenhum (outro) fato concreto de que não deveria ser feito e, para ser justo, nenhum exemplo de pessoas realmente fazendo isso, o que por si só pode ser uma evidência para não faça isso.
Mas o valor OBJECT_ID() é (ou parece ser) usado nas tabelas e visualizações do sistema como chaves de um objeto para outro, então deve haver alguma forma de integridade e confiabilidade.
Para que conste: eu não preciso necessariamente disso, mas simplesmente surgiu na minha mente como uma opção enquanto projetava meu sistema, e fiquei curioso.
Não confie em object_id para seu aplicativo.
Minha experiência é que, uma vez que um objeto é criado, seu object_id será estável enquanto esse objeto existir. A dificuldade está em saber o significado de "enquanto existir".
Se o objeto for descartado e recriado, ele obterá um novo object_id, mesmo que a mesma instrução seja usada nas duas vezes, criando um objeto com o mesmo nome.
Se o script de criação for executado em bancos de dados diferentes (digamos DEV e TEST), ele gerará diferentes object_ids.
Se o banco de dados for restaurado, os valores antigos do object_id podem reaparecer.
O mais arriscado é que a estabilidade de object_ids não é documentada e, portanto, não é garantida. Um patch, atualização, patch de segurança ou qualquer outra coisa pode alterar os IDs de objetos existentes se a MS determinar que isso é algo que eles desejam fazer por qualquer motivo.
MS pode usar object_id em seus metadados internos porque eles conhecem todos os lugares que podem invalidar esses valores e podem escrever seu código de acordo. Eles não publicam esses detalhes para que nós, como programadores de aplicativos, consideremos.
Se você precisar fazer referência a objetos de maneira orientada a dados, armazene seus nomes. Use o tipo de dados correto (SYSNAME) e não se esqueça de armazenar o esquema do objeto também. Se um valor numérico deve ser passado, existem algumas opções. Uma coluna de identidade pode ser adicionada. Os valores serão diferentes entre os ambientes e quando os objetos forem removidos e adicionados novamente. Realmente isso não é melhor que object_id. Melhor pode ser calcular um hash dos nomes de esquema e objeto. Se o algoritmo de hash usado for amplamente comunicado, todos os consumidores poderão gerá-lo sob demanda. Se você tem autoridade sobre os nomes dos objetos (o que parece provável já que você os está escrevendo), você pode simplesmente escolher os ids correspondentes e publicá-los. Não se esqueça da restrição exclusiva nas colunas name e id!