Suponha que eu tenha um procedimento armazenado duplicado, com algumas modificações, em vários bancos de dados. E eu quero fazer referência ao banco de dados no qual o procedimento armazenado está armazenado, mesmo que seja executado em outro banco de dados.
Existe uma maneira de recuperar o caminho completo (..) ou recuperar o banco de dados no qual o procedimento armazenado está armazenado, em vez do banco de dados atual?
sql-server
stored-procedures
Jim Clark
fonte
fonte
Respostas:
Basta usar nomes de uma ou duas partes no procedimento armazenado, e ele fará referência a objetos no banco de dados que contém o procedimento armazenado. Em particular,
Para SQL estático em um procedimento armazenado:
Os nomes de objetos não qualificados serão resolvidos em relação ao esquema que contém o procedimento armazenado.
Os nomes de duas partes serão resolvidos em relação ao banco de dados que contém o procedimento armazenado.
Para SQL dinâmico em um procedimento armazenado:
Os nomes de objetos não qualificados serão resolvidos em relação ao esquema padrão da identidade do usuário executando o procedimento armazenado (por padrão, o chamador).
Os nomes de duas partes serão resolvidos em relação ao banco de dados que contém o procedimento armazenado.
A função db_name () retornará o nome do banco de dados que contém o procedimento armazenado nos dois casos.
fonte
Aqui está um exemplo rápido que eu reuni mostrando funções comuns usadas para se aproximar do que você está procurando.
fonte
Adicionando a excelente resposta de David Browne :
Você está com sorte, porque é assim que os procedimentos armazenados regulares / permanentes, que não são do sistema, já funcionam dessa maneira e você realmente precisa se esforçar para fazer com que os objetos operem no banco de dados atual. É assim que as funções também funcionam: apenas com procedimentos armazenados, você tem opções - marcando-as como "procedimentos armazenados do sistema" ou criando procedimentos armazenados temporários - que você não possui com funções / visualizações / gatilhos / etc.
Como as funções internas se comportam de maneira ligeiramente diferente do SQL estático nos procedimentos armazenados temporários, o exemplo a seguir usa uma tabela não temporária para fazer referência em UDF e Inline-TVF. É verdade que o exemplo a seguir na verdade não testa procedimentos armazenados temporários, mas o motivo pelo qual usei a tabela não temporária é porque, como temos uma instância de comportamento diferente, precisamos garantir que esse comportamento não ocorra aqui. No exemplo a seguir, se qualquer um dos tipos de função estivesse ciente do banco de dados "atual", a referência à tabela não temporária causaria um erro.
CONFIGURAÇÃO
TESTE
fonte