Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2016:criar um procedimento armazenado


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.
  • Execução mais rápida:os procedimentos armazenados são analisados ​​e otimizados assim que são criados e o procedimento armazenado é armazenado na memória. Isso significa que ele será executado muito mais rápido do que enviar muitas linhas de código SQL do seu aplicativo para o SQL Server. Fazer isso requer que o SQL Server compile e otimize seu código SQL toda vez que ele for executado.
  • Tráfego de rede reduzido:se você enviar muitas linhas de código SQL pela rede para o SQL Server, isso afetará o desempenho da rede. Isso é especialmente verdadeiro se você tiver centenas de linhas de código SQL e/ou tiver muita atividade em seu aplicativo. A execução do código no SQL Server (como um procedimento armazenado) elimina a necessidade de enviar esse código pela rede. O único tráfego de rede serão os parâmetros fornecidos e os resultados de qualquer consulta.
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.
  1. 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 de 20 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()));
  2. 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).
  3. 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.
  4. 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.
  1. 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... .
  2. Parâmetros de fornecimento


    Insira um valor para quaisquer parâmetros exigidos pelo procedimento armazenado e clique em OK .
  3. 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).