Quantos parâmetros de procedimento armazenado são muitos?

12

Acabei de começar a escrever um procedimento armazenado no SQL Server 2008 e tem mais de 30 parâmetros. Eu nunca escrevi um com mais de ~ 10 parâmetros, e isso me fez pensar ... Em que ponto existem muitos parâmetros?

Para o contexto ... esse procedimento INSERIR essencialmente uma única linha em uma única tabela. Também haveria um muito semelhante; embora um pouco menor; versão que executa uma atualização na mesma tabela. A maioria das colunas é relativamente pequena, com uma mistura de int e strings ( varchar(200)).

Quais são os problemas; bom ou mal; ter um procedimento com um grande número de parâmetros e qual é o limite em que devo começar a considerar outros padrões?

JoeGeeky
fonte
1
É exatamente como "se você tem que pedir o preço, não pode pagar". Se você começar a se perguntar quantos parâmetros são demais, terá muitos. O principal problema não é o mecanismo, mas você, o leitor / mantenedor humano do código. Então, eu diria que não há problema em ter o maior número possível de códigos gerados automaticamente , mas mantenha-o razoável em código escrito / mantido à mão.
Remus Rusanu

Respostas:

12

Problemas? Eu não argumentaria.

  • O limite é 2100 parâmetros . IIRC já faz 2100 desde o SQL2000, mas um erro de documentação sugeriu que era 1024.
  • Se uma tabela tiver 1000 colunas (devido a uma organização de colunas esparsas no estilo do Sharepoint , por exemplo) e você estiver aplicando o acesso por meio de procedimentos armazenados, seu processo de inserção poderá ter 1000 parâmetros. Nada de errado com isso.
  • Faça uma pausa para revisar o esquema quando encontrar uma tabela ampla (não que 30 seja particularmente ampla). Não é incomum encontrar tabelas que começaram a vida normalizadas, mas a preguiça e / ou a imprudência se expandiram além do reconhecimento.
  • Nem pense brevemente em passar um conjunto de parâmetros como uma lista CSV ou XML. Cega o otimizador de consultas e economiza pouco ou nenhum tempo ou esforço.
  • Não gire manualmente o código do cliente para chamar um procedimento com um grande número de parâmetros. Ferramentas de geração de código, como modelos T4 ou CodeSmith, para o resgate.
Mark Storey-Smith
fonte
1
Obrigado por esta resposta, foi muito bem afirmado. Isso responde perfeitamente à minha pergunta. É muito ruim que eles não têm um crachá para o uso de grandes palavras Scrabble como " irresponsabilidade "
JoeGeeky
2

Joe Celko é um advogado de longas listas de parâmetros, sobre as quais ele escreve detalhadamente neste artigo em duas partes :

A resposta mais simples é usar uma longa lista de parâmetros para construir listas e tabelas derivadas dentro do corpo do procedimento. O servidor SQL pode lidar com até 2100 parâmetros, o que deve ser mais do que suficiente para fins práticos. O SQL Server é realmente um covarde nesse sentido; DB2; pode passar parâmetros de 32K. e o Oracle pode ter parâmetros de 64K.

... a longa lista de parâmetros é composta de parâmetros antigos simples, o que significa que eles podem ser usados ​​para saídas e entradas. Ele também está contido em uma instrução para o otimizador usar.

Eu acho que essas técnicas sempre serão a melhor solução? Claro que não. Não existe tal coisa no SQL. Mas vale a pena olhar quando você tiver um problema apropriado.

um dia quando
fonte