Um procedimento armazenado é um grupo de instruções SQL compiladas em uma. Os procedimentos armazenados podem incluir lógica de negócios e outras construções de programação.
No SQL Server, um procedimento armazenado é um grupo de uma ou mais instruções Transact-SQL ou uma referência a um método CLR (Common Runtime Language) do Microsoft .NET Framework.
Programabilidade
Mas um procedimento armazenado é mais do que apenas um script longo. É um script que foi salvo no SQL Server especificamente sob os Stored Procedures nó, e pode:
- Aceite parâmetros de entrada (e retorne vários valores na forma de parâmetros de saída para o programa de chamada).
- Contém instruções de programação.
- Retorne um valor de status para um programa de chamada para indicar sucesso ou falha e o motivo de qualquer falha.
Os procedimentos armazenados geralmente contêm lógica de negócios. Por exemplo, um procedimento armazenado pode aceitar parâmetros que são passados para ele e testar esses parâmetros usando
IF
declarações. Por exemplo, se o parâmetro for um valor, faça isso, se for outro valor, faça aquilo. Os procedimentos armazenados podem melhorar o desempenho em um aplicativo, porque o procedimento armazenado é analisado e otimizado assim que é criado e, em seguida, armazenado na memória. Executar uma consulta condicional via procedimento armazenado pode ser extremamente rápido - comparado a um aplicativo que envia uma consulta pela rede para o SQL Server e, em seguida, tem todos os dados retornados pela rede para que possa filtrar e selecionar apenas os registros nos quais está interessado.
Benefícios dos Procedimentos Armazenados
Aqui estão alguns dos principais benefícios do uso de procedimentos armazenados:
Benefício | Explicação |
---|---|
Programação modular | Você pode escrever um procedimento armazenado uma vez e chamá-lo várias vezes, de diferentes partes de um aplicativo (e até mesmo de vários aplicativos). |
Desempenho | Os procedimentos armazenados fornecem execução de código mais rápida e reduzem o tráfego de rede.
|
Segurança | Os usuários podem executar um procedimento armazenado sem precisar executar nenhuma das instruções diretamente. Portanto, um procedimento armazenado pode fornecer funcionalidade avançada de banco de dados para usuários que normalmente não teriam acesso a essas tarefas, mas essa funcionalidade é disponibilizada de maneira rigidamente controlada. |
Como criar um procedimento armazenado
Para criar um procedimento armazenado, use o
CREATE PROCEDURE
instrução, seguida pelo código que compõe o procedimento armazenado. Se o seu procedimento armazenado for aceitar parâmetros, eles precisam ser incluídos após o nome. CREATE PROCEDURE myStoredProcedure AS ... OR CREATE PROCEDURE myStoredProcedure @ParameterName DataType AS ...
Agora criaremos um procedimento armazenado com base em uma das visualizações que criamos anteriormente — os RecentAlbums visualizar.
Esta visualização retorna todos os álbuns lançados nos últimos 20 anos. Isso é bom, desde que só precise olhar para trás 20 anos. Mas e se você quiser que o usuário escolha quantos anos ele deve cobrir?
Um procedimento armazenado pode resolver esse problema.
Vamos criar um procedimento armazenado que aceita um parâmetro. O valor do parâmetro será o número de anos para pesquisar novamente. Portanto, esse valor pode ser especificado pelo usuário sempre que executar o procedimento armazenado.
-
Projetar o procedimento armazenado
Abra uma nova janela de consulta e adicione o código para o procedimento armazenado.
No nosso caso, copiaremos/colaremos o código do RecentArtists visualize e modifique a parte superior, para que se torne um procedimento armazenado.
Adicionaremos um parâmetro chamado@Count
que determinará quantos anos o procedimento armazenado deve olhar para trás.
Portanto, substituiremos o valor codificado de20
com@Count
Código de amostra
Aqui está o código do nosso exemplo:
CREATE PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE()));
-
Criar o procedimento armazenado
Quando tudo estiver bem, você pode executar a instrução para criar o procedimento armazenado.
Clique em Executar para criar o procedimento armazenado.
Assim que o procedimento armazenado for criado, você poderá vê-lo no Pesquisador de Objetos (talvez seja necessário atualizar os Procedimentos armazenados nó primeiro).
-
Executar o procedimento armazenado
Agora que ele foi criado, você pode executar o procedimento armazenado.
Abra uma nova janela de consulta, adicione isto:
EXEC spRecentAlbums @Count = 5;
Agora clique em Executar da barra de ferramentas.
O procedimento armazenado retornará todos os álbuns lançados nos últimos 5 anos.
-
Experimente parâmetros diferentes
Tente alterar o valor do parâmetro para ver como isso afeta os resultados.
Você também pode executar várias instruções uma após a outra. Um novo painel de resultados aparecerá para cada instrução.
Modelo de procedimento armazenado
No SQL Server 2016, você pode criar um procedimento armazenado clicando com o botão direito do mouse em Procedimentos armazenados nó no Pesquisador de Objetos e selecionando Novo> Procedimento Armazenado... ou Novo> Procedimento armazenado compilado nativamente... .
Isso abrirá um modelo pronto para ser preenchido com seu próprio procedimento específico.
Execute um procedimento armazenado por meio da GUI
Você também pode usar a interface gráfica do usuário para executar um procedimento armazenado.
-
Inicie o Executar procedimento Caixa de diálogo
No Pesquisador de Objetos, clique com o botão direito do mouse no procedimento armazenado e selecione Executar procedimento armazenado... .
-
Parâmetros de fornecimento
Insira um valor para quaisquer parâmetros exigidos pelo procedimento armazenado e clique em OK .
-
Os resultados
Os resultados são exibidos.
Modificar um procedimento armazenado
Se você precisar modificar um procedimento armazenado existente, basta substituir
CREATE
com ALTER
(junto com o procedimento atualizado). Este exemplo modifica o procedimento armazenado para que os resultados sejam classificados por data de lançamento em ordem decrescente:
ALTER PROCEDURE spRecentAlbums @Count int AS SELECT Albums.ReleaseDate, Albums.AlbumName, Genres.Genre, Artists.ArtistName, Artists.ActiveFrom FROM Albums INNER JOIN Artists ON Albums.ArtistId = Artists.ArtistId INNER JOIN Genres ON Albums.GenreId = Genres.GenreId WHERE (Albums.ReleaseDate > DATEADD(year, - @Count, GETDATE())) ORDER BY Albums.ReleaseDate DESC;
Procedimentos armazenados do sistema
O SQL Server inclui um grande número de procedimentos armazenados do sistema para auxiliar nas tarefas de administração do banco de dados. Muitas das tarefas que você pode executar por meio da GUI podem ser feitas por meio de um procedimento armazenado do sistema. Por exemplo, algumas das coisas que você pode fazer com procedimentos armazenados do sistema incluem:
- Configurar contas de segurança
- Configurar servidores vinculados
- Criar um plano de manutenção de banco de dados
- Criar catálogos de pesquisa de texto completo
- Adicionar login remoto
- Configurar a replicação
- Configurar tarefas agendadas
- e muito mais...
Os procedimentos armazenados do sistema são prefixados com sp_ , portanto, é melhor evitar usar esse prefixo para seus próprios procedimentos.
Convenções de nomenclatura
É uma boa ideia desenvolver uma convenção de nomenclatura consistente para seus procedimentos armazenados (e para todos os outros objetos em seu banco de dados).
Algumas pessoas prefixam seus procedimentos armazenados com usp_ (para indicar um procedimento armazenado definido pelo usuário), outros o iniciam com uma palavra-chave SQL como select , inserir , atualizar , excluir . Outros usam uma abreviação para o aplicativo.
Alguns usam sublinhados para separar cada palavra no procedimento armazenado (por exemplo, recent_albums ), enquanto outros usarão maiúsculas e minúsculas (por exemplo, RecentAlbums ).
Portanto, é possível que nosso procedimento armazenado possa ser nomeado de qualquer um dos seguintes, dependendo da convenção de nomenclatura usada.
- Álbuns recentes
- álbuns_recentes
- uspÁlbuns Recentes
- usp_recent_albums
- selecione álbuns recentes
- select_RecentAlbums
- select_recent_albums
- getRecentAlbums
- get_recent_albums
Você começa a imagem. O importante é a consistência. Escolha um e fique com ele. Isso tornará mais fácil quando você precisar usar um procedimento armazenado. Imagine ter pontuações, ou mesmo centenas de procedimentos armazenados, e toda vez que você for executar um, você precisa navegar até ele no Pesquisador de Objetos simplesmente porque não consegue lembrar se o chamou de usp_RecentAlbums ou uspRecentAlbums .
Conforme mencionado, evite usar sp_ como o prefixo para seus nomes de procedimento armazenado. O SQL Server usa esse prefixo para os procedimentos armazenados do sistema.
O SQL Server pesquisa os procedimentos armazenados do sistema primeiro, portanto, na melhor das hipóteses, você terá um impacto no desempenho. Na pior das hipóteses, seu procedimento não será executado (se compartilhar um nome com um procedimento armazenado do sistema).