No SQL Server, qual é o objetivo de agrupar procedimentos armazenados?

35

Um dos problemas mais desconcertantes com os quais tive que lidar está relacionado aos grupos de procedimentos armazenados. Dado um procedimento armazenado, usp_DoSomethingAwesomeposso criar esse proc em outro grupo chamando-o usp_DoSomethingAwesome;2.

Descobri isso ao solucionar alguns problemas de replicação (Publicador: SQL 2000 Ent., Dist / Sub: 2008 R2 Ent.) Que surgiram com alguns dos procedimentos armazenados de replicação, inserção e atualização gerados pelo sistema.

Qual é o propósito / pensamento por trás dessa capacidade de "agrupamento"?

swasheck
fonte

Respostas:

32

É como sobrecarregar um método. Essencialmente, você pode criar duas ou mais versões do seu procedimento armazenado, onde cada uma faz coisas diferentes - pegue um número diferente de parâmetros, opere em tabelas diferentes, tenha saídas diferentes, etc.

Eles são chamados de Procedimentos numerados e estão totalmente obsoletos ( anunciados desde 2005 ). Eles ainda são suportados no SQL Server 2012, mas alguns recursos não funcionam bem com eles. Por exemplo, eles são considerados uma violação de contenção nos bancos de dados contidos e qualquer procedimento numerado> 1 não será criado:

Msg 12829, Nível 16, Estado 1, Procedimento em branco, Linha 1
O procedimento armazenado 'dbo.blat' refere-se a um grupo de procedimentos armazenados numerados. Os procedimentos armazenados numerados não estão disponíveis nos bancos de dados contidos. Consulte o tópico Manuais Online de Noções Básicas Sobre Bancos de Dados Contidos para obter mais informações sobre bancos de dados contidos.

Aaron Bertrand
fonte
5

A capacidade (descontinuada) de agrupar procedimentos armazenados parece existir para um único objetivo (e bastante tolo): a capacidade de excluir em massa por meio de uma única DROPinstrução. De acordo com a documentação do SQL Server 2000 MSDN para criar um procedimento armazenado :

Agrupamento
Um procedimento pode ser criado com o mesmo nome que um procedimento armazenado existente se receber um número de identificação diferente, o que permite que os procedimentos sejam agrupados logicamente. Os procedimentos de agrupamento com o mesmo nome permitem que sejam excluídos ao mesmo tempo. Os procedimentos usados ​​no mesmo aplicativo geralmente são agrupados dessa maneira. Por exemplo, os procedimentos usados ​​com o aplicativo my_app podem ser nomeados my_proc; 1, my_proc; 2 e assim por diante. Excluir my_proc exclui o grupo inteiro. Depois que os procedimentos foram agrupados, procedimentos individuais dentro do grupo não podem ser excluídos.

Não há benefícios adicionais ao usar essa construção, uma vez que o uso do mesmo nome base nem sequer permite sobrecarga (as assinaturas não precisam ser exclusivas e não há roteamento de execução automática para um "número" específico) e, portanto, você ainda precisa use o "número" ao executar. Daí a determinação de "bobo" (e isso provavelmente está sendo bom demais sobre isso ;-).

Solomon Rutzky
fonte