Criando pacotes SSIS programaticamente usando o ManagedDTS

The control flow of the package created using ManagedDTS


Nos artigos publicados anteriormente nesta série, explicamos como usar o Biml para criar e gerenciar SQL
    Pacotes do SSIS (Server Integration Services). Neste artigo, falaremos sobre a primeira alternativa dessa linguagem de marcação, que é o modelo de objeto gerenciado do Integration Services (ManagedDTS e assemblies relacionados) fornecido pela Microsoft.

Neste artigo, ilustraremos primeiro como criar, salvar e executar pacotes SSIS usando o ManagedDTS em C # e, em seguida,
    faremos uma pequena comparação com o Biml.

Modelo de objeto do Integration Services

Para explicar o modelo de objeto dos serviços de integração, primeiro precisamos dar uma olhada na arquitetura do SSIS. Como mostrado em
    a figura abaixo (Referência: Visão Geral da Programação do Integration Services)

Arquitetura SSIS

Figura 1 – Arquitetura SSIS

Podemos observar que os principais componentes do SSIS são:

  1. Serviço de Serviços de Integração: É um serviço do Windows que monitora a execução de pacotes, mas também gerencia o armazenamento de pacotes no SQL Server
  2. Mecanismo de tempo de execução do Integration Services: Controla o gerenciamento e a execução de pacotes, implementando a infraestrutura que permite a ordem de execução, o log, as variáveis ​​e a manipulação de eventos
  3. O mecanismo de fluxo de dados: Ele gerencia as tarefas de fluxo de dados em um pacote, pois é especializada para mover dados entre diferentes origens e destinos e pode conter componentes adicionais

Conforme mostrado na arquitetura, o tempo de execução e o mecanismo de fluxo de dados têm um modelo de objeto que permite que eles sejam totalmente gerenciados a partir de aplicativos personalizados, designer do SSIS ou assistente de Importação e Exportação do SQL Server. Além disso, ambos são escritos em código nativo e podem ser acessados ​​usando utilitários de linha de comando (DTExec) ou aplicativos personalizados.

O modelo de objeto permite que os desenvolvedores desenvolvam e gerencia pacotes SSIS usando linguagens compatíveis com .NET.

Desenvolvimento de pacotes SSIS usando o modelo de objeto gerenciado

Assembléias de desenvolvimento do SSIS

Os seguintes assemblies são aqueles que você pode precisar para desenvolver, gerenciar e executar pacotes SSIS do .NET
    formulários:

Nome

Nome Qualificado

Descrição

ManagedDTS

Microsoft.SqlServer.ManagedDTS.dll

Mecanismo de tempo de execução gerenciado

PipelineHost

Microsoft.SqlServer.PipelineHost.dll

Mecanismo de fluxo de dados gerenciados

DTSRuntimeWrap

Microsoft.SqlServer.DTSRuntimeWrap.dll

Wrapper para o mecanismo de tempo de execução nativo

DTSPipelineWrap

Microsoft.SqlServer.DTSPipelineWrap.dll

Wrapper para mecanismo de fluxo de dados nativo

Antes do SQL Server 2019, esses assemblies eram localizados em : Arquivos de Programas Microsoft SQL Server SDK AssembliesCaminho No SQL Server 2019, eles estão localizados no global
    cache de montagem com os assemblies da estrutura .NET.

Criando um novo pacote usando o modelo de objeto

Para criar um pacote SSIS a partir do seu código .Net, você deve adicionar o assembly ManagedDTS como uma referência no seu projeto. Então você deve importar o Microsoft.SqlServer.Dts.Runtime montagem da seguinte forma:

O código a seguir cria um pacote vazio e o salva como arquivo .dtsx:

Observe que você pode salvar o pacote no SQL Server (banco de dados Msdb) usando SaveToSqlServer () e SaveToSqlServerAs () métodos, ou você pode salvá-lo em um repositório de pacotes SSIS usando SaveToDtsServer () método. Para obter mais informações, consulte: Salvando um pacote programaticamente.

Carregando pacote de um arquivo existente

Para carregar um pacote existente, você pode usar o método Application.LoadPackage () da seguinte maneira:

Adicionando gerenciadores de conexões

Para adicionar um gerenciador de conexões, você deve usar a classe Application.ConnectionManager e especificar o
    tipo de conexão e as informações necessárias com base nesse tipo. Como exemplo, o código a seguir adiciona um banco de dados OLE
    gerenciador de conexões:

Adicionando tarefas

Usando ManagedDTS, as tarefas são adicionadas à propriedade Executables na classe Package. Existem diferentes abordagens
    para adicionar uma tarefa ao fluxo de controle do pacote:

  1. Adicionando a tarefa explicitamente, fornecendo as informações de montagem manualmente

    Nesta abordagem, você deve inserir o nome do assembly, o nome qualificado, a versão, a cultura e o token da chave pública no método Add (). Por exemplo:

  2. Usando o AssemblyQualifiedName

    Nessa abordagem, você deve adicionar o assembly relacionado à tarefa como referência e importá-lo em seu código; em seguida, você
        deve recuperar o nome qualificado de montagem da classe relacionada à tarefa (localizada em : Arquivos de Programas Microsoft SQL Server DTS Tasks ”) Como exemplo, se você precisar adicionar uma tarefa Executar SQL, deverá
        primeiro adicione Microsoft.SqlServer.SQLTask.dll como referência. Então você deve usar o seguinte código:

  3. Usando o moniker STOCK

    Você pode consultar a documentação a seguir para obter uma lista completa dos identificadores de estoque de tarefas. Então você deve usá-lo da seguinte maneira:

Adicionando uma tarefa de fluxo de dados

Como mencionamos acima, a tarefa de fluxo de dados é uma tarefa especial do SSIS onde podemos adicionar componentes. Por esse motivo, nós
    falará sobre isso em uma seção separada. Como mencionamos na primeira seção, você deve adicionar PipelineHost e
    Assemblies DTSPipelineWrap além do ManagedDTS para trabalhar com o mecanismo de fluxo de dados. O código a seguir é criar
    um pacote, adicione um gerenciador de conexões OLE DB, adicione uma tarefa de fluxo de dados que contenha uma fonte OLE DB e OLE DB
    destino e configure-os para importar dados de [Person].[Person] mesa em
[Person].[Person_temp]:

Adicionando componentes Tarefas de Fluxo de Dados

Você pode adicionar componentes da tarefa de fluxo de dados usando o Nome da Criação ou o nome qualificado da montagem. A segunda abordagem
    requer a importação do conjunto relacionado ao componente (localizado em : Arquivos de Programas Microsoft SQL Server DTS PipelineComponents ”) O exemplo a seguir ilustra como adicionar componentes de origem e destino do OLE DB e criar um mapeamento entre eles:

Após a execução do aplicativo, o pacote é criado com sucesso. As seguintes capturas de tela mostram o pacote
    Tarefa Controle de fluxo e fluxo de dados:

O fluxo de controle do pacote criado usando o ManagedDTS

Figura 2 – Fluxo de controle de pacote criado

A tarefa de fluxo de dados do pacote criado usando o ManagedDTS

Figura 3 – Tarefa de fluxo de dados criada

Executando pacote programaticamente

Após criar um pacote, podemos executá-lo usando o método Execute () da seguinte maneira:

Recursos online

Nas seções anteriores, explicamos brevemente como criar e executar pacotes usando o ManagedDTS, mas há muito mais instruções que você precisa saber, como mapear tarefas, configurar propriedades de tarefas, manipulação de erros …
    por esse motivo, a Microsoft forneceu documentação útil onde a maioria dessas operações é explicada; Documentação do desenvolvedor do Integration Services.

Comparando com Biml

Simplicidade

Após criar o pacote usando o ManagedDTS, nós o converteremos em um script Biml, conforme explicado em Convertendo pacotes SSIS em scripts Biml. Você pode verificar como o Biml substitui um script C # complexo e facilita o processo de leitura e edição
    pois é mais simples e não requer conhecimento de programação.

Contexto

Por outro lado, é mais preferível usar o ManagedDTS ao criar e executar os pacotes dentro de
    um aplicativo e está relacionado a outras tarefas, pois o Biml é gerenciado em uma solução SSIS e não é
    integrado em um aplicativo.

Tratamento de erros no desenvolvimento

A manipulação de erros é um desastre ao usar o ManagedDTS, pois não mostra uma mensagem de erro clara, como mostra a imagem abaixo. Enquanto estiver no Biml, a ferramenta “Verificar erros no Biml” retorna todos os erros encontrados durante a validação do script.

Exceção clara ao criar pacote usando o ManagedDTS

Figura 4 – Lançou uma exceção ao criar o pacote SSIS programaticamente

Recursos

Faltam artigos e guias relacionados para as duas tecnologias. Mas a capacidade de converter pacotes SSIS em scripts Biml facilita a aprendizagem, pois simplifica o processo de aprendizado caso você esteja familiarizado com o SSIS.

Conclusão

Neste artigo, explicamos uma das alternativas para criar pacotes SSIS usando o Biml, que é o modelo de objeto gerenciado do mecanismo de tempo de execução do serviço de integração. Além disso, fizemos uma pequena comparação entre as duas abordagens para ilustrar a principal diferença.

Índice

Hadi Fadlallah
Últimas mensagens de Hadi Fadlallah (ver todos)

Criando pacotes SSIS programaticamente usando EzAPI

Class hierarchy for the data flow engine in EzApi


No artigo publicado anteriormente, Alternativas Biml: Criando pacotes SSIS programaticamente usando o ManagedDTS, falamos sobre a criação de pacotes SSIS usando o modelo de objeto gerenciado do mecanismo SSIS (ManagedDTS). Neste artigo, ilustraremos outra alternativa Biml, que é a biblioteca de classes EzApi, e faremos uma comparação entre as duas tecnologias.

O que é a biblioteca de classes EzAPI?

Como falamos anteriormente, a Microsoft fornece um conjunto de assemblies que permite aos usuários criar, gerenciar e executar programaticamente pacotes SSIS. A principal fraqueza do uso desses conjuntos é que eles são muito complexos e difíceis de entender. Por esse motivo, a equipe do Microsoft SSIS desenvolveu uma biblioteca .Net Class chamada EzApi que facilita a automação do desenvolvimento de pacotes SSIS. Essa biblioteca de classes é desenvolvida usando C # e foi usada internamente pela equipe por um tempo. Posteriormente, foi publicado no CodePlex no projeto de amostras da comunidade do Integration Services e, posteriormente, foi migrado para o Git-Hub após o encerramento do site do Code Plex, mas esse projeto não é aprimorado por um tempo.

Após o lançamento do SQL Server 2016, Pedros Morais (desenvolvedor Full Stack) anunciou o EzApi2016, uma bifurcação do projeto original para adaptar esta biblioteca à nova versão do SQL Server. E mais tarde, esta biblioteca está disponível no NuGet e é aprimorada periodicamente. Mais informações sobre a melhoria podem ser encontradas no site da Pedro Morais.

Essa biblioteca de classes pode ser considerada como uma camada intermediária entre o aplicativo e o modelo de objeto gerenciado do SSIS. Cada objeto nesta biblioteca é mapeado para o objeto COM relacionado no SSIS. Você pode verificar a hierarquia de classes dos mecanismos de tempo de execução e fluxo de dados nas seguintes imagens (Referência: EzAPI – API de criação de pacote alternativa)

Hierarquia de classes para o mecanismo de tempo de execução no EzApi

Figura 1 – Hierarquia de classes para o mecanismo de tempo de execução

Hierarquia de classes para o mecanismo de fluxo de dados no EzApi

Figura 2 – Hierarquia de classes para o mecanismo de fluxo de dados

Conforme mostrado na hierarquia de classes do mecanismo de tempo de execução, a entidade base é o executável, que pode ser um contêiner ou uma tarefa. E no mecanismo de fluxo de dados, a entidade base é um componente que pode ser um adaptador (origem ou destino – pois eles adaptam o SSIS a uma fonte externa) ou uma transformação.

A maneira mais fácil de usar essa biblioteca de classes é abrir o console do gerenciador de pacotes NuGet no Visual studio (Ferramentas> Gerenciador de Pacotes NuGet> Console do Gerenciador de Pacotes).

Console do Openning Package Manager

Figura 3 – Abrir o console do gerenciador de pacotes NuGet

Em seguida, você deve usar o seguinte comando (0.8.93 é a versão mais recente no momento):

Saída do console do gerenciador de pacotes

Figura 4 – Captura de tela da saída do console do gerenciador de pacotes

Agora, a biblioteca de classes é adicionada como referência do projeto:

Mostrando a biblioteca de classes EzApi na referência do projeto

Figura 5 – Biblioteca de classes adicionada como referência

Se você estiver trabalhando offline, basta fazer o download e criar o projeto localmente e adicionar a biblioteca de classes gerada como referência no seu projeto.

Construindo pacotes usando o EzApi

Antes de começar, observe que pode ser necessário adicionar uma referência para os assemblies de modelo de objeto gerenciado do SSIS ao projeto, pois isso é exigido por alguns dos métodos da biblioteca de classes.

Criando um novo pacote

Primeiro de tudo, você deve importar o espaço para nome Microsoft.SqlServer.SSIS.EzAPI na classe atual:

Para criar um novo pacote e salvá-lo em um caminho local, você pode usar o seguinte código:

Carregando pacote do arquivo existente

Para carregar um pacote de um arquivo dtsx existente, você pode usar o seguinte código:

Adicionando gerenciadores de conexões

Para adicionar um gerenciador de conexões, você deve usar o EzConnectionManager ou a classe relevante do gerenciador de conexões da seguinte maneira:

Adicionando tarefas

Para adicionar uma tarefa a um contêiner (pacote ou contêiner), você deve usar a classe relacionada à tarefa e especificar o contêiner pai na inicialização da classe. Por exemplo:

Adicionando tarefas de fluxo de dados

Usando o Ezapi, adicionar tarefas é mais fácil do que o modelo de objeto gerenciado do SSIS. O código a seguir é usado para criar um pacote, adicionando um gerenciador de conexões OLE DB, adicionando uma tarefa de fluxo de dados com uma origem e destino OLE DB, a fim de transferir dados entre [Person].[Person] e [Person].[Person_temp] tabelas:

Executando pacotes

Para executar um pacote, você pode simplesmente usar o método Execute () da seguinte maneira:

Modelos de pacote

Existem alguns pacotes de modelos adicionados nesta biblioteca de classes. Como exemplo:

  • EzDataFlowPackage: um pacote que contém uma tarefa de fluxo de dados
  • EzForLoopDFPackage: um pacote que contém um loop for com uma tarefa de fluxo de dados
  • EzForLoopPackage: um pacote que contém um contêiner for loop

Esses modelos diminuem o tempo e as linhas de códigos necessárias para desenvolver pacotes.

Recursos online

O EzApi não é muito popular, mas há algum artigo on-line que você pode consultar para saber mais:

Comparando com Biml

Simplicidade

Após criar o pacote, nós o converteremos em um script Biml, conforme explicamos no artigo Convertendo pacotes SSIS em scripts Biml

Como você pode ver, o script Biml é um pouco simples que o código C # que escrevemos anteriormente. Podemos dizer que as duas tecnologias utilizadas facilitam muito mais a automação do pacote SSIS do que os assemblies tradicionais fornecidos pela Microsoft. E isso depende do histórico de programação do usuário, pois os desenvolvedores se familiarizarão mais com o EzAPI, enquanto outros funcionários ou analistas irão para o Biml.

Contexto

Como mencionamos no artigo anterior, se você precisar automatizar a criação e o gerenciamento de pacotes em um aplicativo, não poderá usar o Biml. Em outros casos, você pode escolher entre as duas tecnologias.

Tratamento de erros no desenvolvimento

O EzAPI tem a mesma limitação que o ManagedDTS, pois não mostra uma mensagem de erro clara se encontrada durante a criação do pacote:

Exceção sem sentido é lançada ao criar o pacote programaticamente usando o EzApi

Figura 6 – Exceção sem sentido lançada ao criar o pacote programaticamente

Recursos online

Mesmo que o Biml não tenha muitos recursos on-line, eles são muito mais do que o relacionado ao EzAPI, pois você pode não encontrar mais artigos do que os mencionados anteriormente (mesmo esses artigos levam muito tempo para serem reconhecidos).

Conclusão

Neste artigo, ilustramos outra alternativa do Biml chamada EzAPI, falamos brevemente sobre essa biblioteca e por que ela foi desenvolvida. Depois, explicamos como usá-la para criar e gerenciar pacotes SSIS. Finalmente, fizemos uma comparação entre as duas tecnologias.

Índice

Hadi Fadlallah
Últimas mensagens de Hadi Fadlallah (ver todos)

Aprenda a escrever consultas SQL básicas

How to execute a query in SQL Fiddle


Essencialmente, a linguagem SQL nos permite recuperar e manipular dados nas tabelas de dados. Neste artigo, entenderemos e obteremos a capacidade de escrever consultas SQL fundamentais. Inicialmente, examinaremos as principais noções que precisamos conhecer para escrever consultas no banco de dados.

O que é o T-SQL?

SQL é a abreviação das palavras da Structured Query Language e é usada para consultar os bancos de dados. Transact-SQL
    A linguagem (T-SQL) é uma implementação estendida do SQL para o Microsoft SQL Server. Neste artigo, usaremos os padrões T-SQL nos exemplos.

O que é um banco de dados relacional?

De maneira mais simples, podemos definir o banco de dados relacional como a estrutura lógica na qual são mantidas as tabelas de dados que podem
    se relacionam.

O que é uma tabela de dados?

Uma tabela é um objeto de banco de dados que nos permite manter dados através de colunas e linhas. Podemos dizer que as tabelas de dados são os principais objetos dos bancos de dados porque eles estão mantendo os dados nos bancos de dados relacionais.

Suponha que tenhamos uma tabela que contém os dados detalhados dos alunos da turma de história. É formado no seguinte
    colunas.

Nome: Nome do aluno

Sobrenome: Sobrenome do aluno

Lição: Lição optada

Era: Idade do aluno

PassMark: Marca de passagem

Ilustração de dados de tabela do aluno

Usaremos esta tabela em nossas demonstrações neste artigo. O nome desta tabela de dados é Aluna.

Nossa primeira consulta: instrução SELECT

o SELECT A instrução pode ser descrita como o ponto inicial ou zero das consultas SQL. o
SELECT A instrução é usada para recuperar dados das tabelas de dados. No SELECT
sintaxe da instrução, em primeiro lugar, especificamos os nomes das colunas e os separamos por vírgula se usarmos uma única coluna
    não use vírgula nas instruções SELECT. Na segunda etapa, escrevemos o A PARTIR DE cláusula e como
    por último, especificamos o nome da tabela. Quando consideramos o exemplo abaixo, ele recupera dados de Nome
e Sobrenome colunas, o SELECT A sintaxe da instrução será a seguinte:

Consultas SQL básicas: instrução SELECT

Se quisermos recuperar dados apenas do Nome coluna, o SELECT sintaxe da instrução
    será como abaixo:

Consultas SQL básicas: instrução SELECT para coluna única

Gorjeta: Podemos facilmente experimentar todos esses exemplos neste artigo no SQL Fiddle sobre isso
    ligação. Depois de navegar para o
    No link, precisamos limpar o painel de consulta e executar as consultas de amostra.

Como executar uma consulta no SQL Fiddle

O asterisco (*) define todas as colunas da tabela. Se considerarmos o exemplo abaixo, o
SELECT A instrução retorna todas as colunas do Aluna tabela.

Usando o sinal de asterisco (*) na instrução SELECT

  • Gorjeta:
  • Nosso principal objetivo deve ser obter resultados das consultas SQL o mais rápido possível, com o mínimo de recursos
        consumo e tempo mínimo de execução. Quanto possível, precisamos evitar o uso do sinal de asterisco (*) no
    SELECT afirmações. Esse tipo de uso faz com que consuma mais custos de IO, CPU e rede. Como um resultado,
        se não precisarmos de todas as colunas da tabela em nossas consultas, podemos abandonar o sinal de asterisco e usar apenas o
        colunas necessárias

Filtrando os Dados: Cláusula WHERE

ONDE A cláusula é usada para filtrar os dados de acordo com as condições especificadas. Depois de
ONDE , precisamos definir a condição de filtragem. O exemplo a seguir recupera os alunos
    cuja idade é maior e igual a 20.

Consultas SQL básicas: cláusula WHERE

GOSTAR operator é um operador lógico que fornece para aplicar um padrão de filtragem especial a
ONDE condição nas consultas SQL. Sinal de porcentagem (%) é o principal curinga a ser usado como
    uma conjunção com o GOSTAR operador. Através da consulta a seguir, recuperaremos os alunos
    cujos nomes começam com J personagem.

Uso do operador LIKE em uma cláusula WHERE

DENTRO operador nos permite aplicar vários filtros de valor a ONDE cláusula. o
    a consulta a seguir busca os dados dos alunos que fizeram as lições de história romana e europeia.

Uso do operador IN em uma cláusula WHERE

o ENTRE O operador filtra os dados que se enquadram no valor inicial e final definido. o
    a consulta a seguir retorna dados para os alunos cujas notas são iguais e maiores que 40 e menores e iguais a
    60

ENTRE o uso do operador em uma cláusula WHERE

Classificando os dados: Instrução ORDER BY

ORDENAR POR A instrução nos ajuda a classificar os dados de acordo com a coluna especificada. O conjunto de resultados de
    os dados podem ser classificados em ordem crescente ou decrescente. ASC palavra-chave classifica os dados em ordem crescente
    ordem e o DESC A palavra-chave classifica os dados em ordem decrescente. A consulta a seguir classifica o
    dados dos alunos em ordem decrescente, de acordo com as expressões da coluna PassMark.

Consultas SQL básicas: instrução ORDER BY

Por padrão ORDENAR POR A instrução classifica os dados em ordem crescente. O exemplo a seguir demonstra a
    uso padrão do ORDENAR POR declaração.

Classificando os dados em ordem crescente com a ajuda da palavra-chave ASC.

Eliminando os dados duplicados: cláusula DISTINCT

o DISTINCT é usada para eliminar dados duplicados das colunas especificadas para que o resultado
    O conjunto é preenchido apenas com os valores distintos (diferentes). No exemplo a seguir, recuperaremos
Lição dados da coluna, no entanto, ao fazer isso, recuperaremos apenas valores distintos com a ajuda de
    a DISTINCT cláusula

Consultas SQL básicas: cláusula DISTINCT

Como podemos ver, o DISTINCT A cláusula removeu os vários valores e esses valores foram adicionados ao
    conjunto de resultados apenas uma vez.

Questionário

Nesta seção, podemos testar nossos aprendizados.

Questão 1:

Escreva uma consulta que mostre o nome e o sobrenome do aluno com idades entre 22 e 24.

Responda :

Questão 2:

Escreva uma consulta que mostre os nomes e idades dos alunos na ordem decrescente que faz as lições de história romana e antiga.

Responda :

Conclusão

Neste artigo, aprendemos como podemos escrever as consultas SQL básicas, além de demonstrarmos o uso das consultas com exemplos simples.

Esat Erkec
Últimas mensagens de Esat Erkec (ver todos)

Blogar é mais do que apenas tráfego – SQLBlog

Blogar é mais do que apenas tráfego - SQLBlog


Blogar é mais do que apenas tráfego - SQLBlog 1 Alguns anos atrás, Brent Ozar escreveu um post chamado “Blog para seu currículo, não para seus leitores”, e ele está totalmente certo. Eu queria compartilhar meus pensamentos sobre por que o blog é um cenário em que todos saem ganhando de várias maneiras, às vezes para o autor, outras para o leitor e, geralmente, ambas.

  • Documente suas realizações no trabalho. Pode ser fácil perder o controle dos problemas que você resolveu, mas não se você os estiver anotando. A publicação deles no mundo (ou mesmo apenas em um blog interno) obriga você a ter seu melhor controle de qualidade, demonstrar sua própria responsabilidade e melhorar sua capacidade de descrever o problema e a solução. Refazer suas etapas e documentar tudo também pode ajudar a antecipar perguntas que os leitores possam ter ou identificar soluções alternativas que você não considerou. Isso pode ser útil para você, seus colegas, seu chefe atual e seu próximo chefe.
  • Seja uma inspiração para os outros – incluindo o seu futuro eu. Ainda me orgulho de algumas das soluções que encontrei há 10 anos e ainda lembro de postagens antigas para refrescar minha mente sobre um problema semelhante que estou enfrentando hoje. Cenários em que eu estava apenas colocando algo totalmente documentado em minhas próprias palavras, e no contexto do meu próprio problema, podem ser suficientes para dar a alguém o momento da lâmpada que de outra forma não teria acontecido. Qualquer pessoa pode regurgitar o Books Online, mas destacar algo que a documentação não diz a você, ou mesmo apenas explicá-lo com suas próprias palavras, pode fazer toda a diferença no mundo. Se outras pessoas puderem aprender com suas postagens, podem ser mais incentivadas a escrever sobre suas próprias soluções.
  • Construa uma referência canônica. Foi por isso que comecei o aspfaq.com em 1999 – respondi muitas e muitas vezes às mesmas perguntas e lutei contra os mesmos mitos e contra-argumentos, uma FAQ opinativa parecia a solução ideal. Durante anos, serviu como minha própria referência para dezenas de trechos de código que eu escrevi, mas que desde então esqueci. Esse mesmo valor existe nas postagens que escrevi na semana passada, no mês passado e no ano passado. Eu escrevi o post Uma dica rápida ao usar vários contêineres do Docker e o SQL Server, não porque acho que há um grande número de pessoas por aí que precisam dessas informações, mas não preciso memorizar toda essa linha de comando. Eu queria estar inventando isso.

Não estou tentando parecer uma autoridade aqui. Cada um de nós pode ter nossos próprios motivos para publicar no blog e pode incluir itens como dinheiro, SEO e pontos de MVP. E todos podemos perceber um pouco diferente os benefícios de fazê-lo. Eu só queria compartilhar alguns dos resultados positivos que vejo e, talvez, fazer outra pessoa percebê-los também.

INSERT IN T-SQL Statement no SQL Server

EX9


Neste artigo, examinaremos profundamente a instrução INSERT INTO mostrando os diferentes formatos de sintaxe e cenários de uso para essa instrução.

A linguagem T-SQL é uma rica linguagem de programação de banco de dados que fornece um grande número de instruções e funções dinâmicas que nos ajudam a executar qualquer funcionalidade de maneiras diferentes, com base em nossas habilidades de desenvolvimento.

Uso

A instrução INSERT INTO T-SQL é usada principalmente para adicionar uma ou mais linhas à tabela de destino ou exibição no SQL Server. Isso pode ser feito fornecendo valores constantes na instrução INSERT INTO ou fornecendo a tabela ou exibição de origem da qual copiaremos as linhas.

Sintaxe

A instrução INSERT INTO T-SQL possui uma sintaxe dinâmica que se ajusta a todos os tipos de processos de inserção de dados. Para uma visão detalhada da instrução INSERT INTO T-SQL, consulte a documentação do Microsoft INSERT INTO.

A sintaxe da instrução INSERT INTO T-SQL usada para inserir uma única linha em uma tabela ou exibição do banco de dados do SQL Server é como:

Tabela INSERT INTO (coluna1, coluna2,…)

VALORES (expressão1, expressão2, …);

E a sintaxe da instrução INSERT INTO usada para inserir várias linhas de uma tabela de banco de dados de origem é como:

Tabela INSERT INTO (coluna1, coluna2,…)

SELECT expressão1, expressão2,…

FROM source_tables

[WHERE conditions];

Das instruções de sintaxe anteriores:

  • o tabela é o nome da tabela de destino na qual as linhas serão inseridas

  • Coluna1, coluna2 são os nomes das colunas na tabela de destino que serão preenchidas com os valores fornecidos
  • o expression1, expression2 são os valores que serão atribuídos às colunas mencionadas na tabela de destino com base na ordem fornecida. Leve em consideração que você deve fornecer os valores para todas as colunas NOT NULL na tabela de destino e, opcionalmente, fornecer valores para as colunas NULL

  • o source_tables é o nome da tabela da qual os valores serão copiados e inseridos na tabela de destino. Esses valores serão filtrados com base nas condições WHERE fornecidas

  • o PARA DENTRO A palavra-chave da instrução INSERT INTO é opcional

Começando

Para fins de demonstração, criaremos uma nova tabela de teste, que contém uma coluna IDENTITY, NULL e NOT NULL, e executaremos as alterações gradualmente nessa tabela para cobrir a maioria dos casos de uso comuns do INSERT INTO T- Instrução SQL.

A tabela de demonstração pode ser criada usando a instrução CREATE TABLE T-SQL abaixo:

Exemplos

A maneira simples de usar a instrução INSERT INTO para adicionar um novo registro à tabela criada é fornecer os valores em formato constante, onde os valores serão fornecidos para todas as colunas NULL e NOT NULL, exceto para as colunas geradas automaticamente, no ordem correta para as colunas na tabela de destino, como na instrução T-SQL abaixo:

Ao verificar a linha inserida na tabela de destino, você verá que o registro foi inserido com sucesso e atribuiu um valor de ID gerado automaticamente a 1, conforme mostrado abaixo:

EX1

Para inserir vários registros na mesma instrução INSERT INTO, em vez de escrever várias instruções de inserção, podemos fornecer os valores para cada linha no formato separado por vírgula, como na instrução T-SQL abaixo que insere três novas linhas na tabela de demonstração :

Ao verificar a tabela para as linhas recém-inseridas, você verá que três novos registros são inseridos na tabela de destino e atribuem valores de ID incrementados automaticamente, conforme mostrado abaixo:

EX2

Para inserir valores apenas para colunas específicas, devemos mencionar o nome dessas colunas e fornecer os valores para essas colunas na mesma ordem que na lista de colunas, levando em consideração que todas as colunas NOT NULL estão listadas e atribuídas, como na instrução T-SQL abaixo:

Na tabela de destino, você verá que uma nova linha é inserida com os valores das colunas atribuídos e o valor NULL para as colunas NULL que não são mencionadas na lista de colunas da instrução INSERT INTO T-SQL, conforme mostrado abaixo:

EX3

Você também pode fornecer a lista de colunas na instrução INSERT INTO em uma ordem diferente da ordem das colunas na tabela de destino, certificando-se de atribuir valores para as colunas na mesma ordem listada na instrução INSERT INTO, como na instrução T-SQL abaixo:

E o registro será inserido com sucesso, com o valor correto atribuído a cada coluna, conforme mostrado abaixo:

EX4

Se você tentar atribuir valores às colunas de nome e data de nascimento apenas na instrução INSERT INTO T-SQL, como na instrução abaixo:

A execução da instrução falhará, pois você deve atribuir valor à coluna NOT NULL do número de telefone na instrução INSERT INTO T-SQL, lembrando que todas as colunas NOT NULL são obrigatórias, conforme mostrado na mensagem de erro abaixo:

Erro1

Vamos modificar a tabela de destino adicionando uma nova coluna computada usada para calcular a idade de cada aluno, conforme mostrado abaixo:

Lembre-se de que o valor da coluna calculada será calculado automaticamente com base na equação definida, sem poder inserir esse valor explicitamente.

Ao verificar os dados da tabela de destino novamente, você verá que a idade é calculada automaticamente para todos os alunos, conforme mostrado abaixo:

EX5

Se você tentar inserir um valor explícito para a coluna computada, usando a instrução INSERT INTO abaixo:

A execução da instrução falhará, mostrando que você não pode modificar o valor calculado automaticamente da coluna calculada, conforme mostrado abaixo:

Erro2

Além disso, se você tentar inserir um valor explícito para a coluna ID, com a propriedade IDENTITY, que será automaticamente incrementada e gerada, como na instrução INSERT INTO abaixo:

A execução da instrução INSERT falhará, mostrando que você não pode inserir um valor explícito para a coluna de identidade gerada automaticamente, como na mensagem de erro abaixo:

Erro3

Para permitir a inserção de um valor explícito para a coluna de identidade, precisamos ativar a propriedade IDENTITY_INSERT antes de executar a instrução INSERT INTO e desabilitá-la após inserir o valor, certificando-se de mencionar o nome de todas as colunas NOT NULL e a coluna de identidade e atribua valores para a todas essas colunas na ordem correta, como na instrução T-SQL abaixo:

E a nova linha será inserida com sucesso com o valor de identidade fornecido explicitamente. Fornecer um valor explícito para a coluna de identidade não é altamente recomendado, a menos que você planeje copiar um registro para outra tabela com o mesmo valor de identidade, pois isso fará uma lacuna nos valores de identidade e começará a contar após o valor de ID fornecido, conforme mostrado abaixo:

EX6

Vamos modificar a tabela de destino novamente, adicionando uma nova coluna NULL de identificador exclusivo, levando em consideração que devemos fornecer um valor padrão a ser atribuído às colunas existentes, caso planejemos adicionar a coluna GUID como NOT NULL. A nova coluna pode ser adicionada usando a instrução ALTER TABLE T-SQL abaixo:

A coluna uniqueidentifier pode ser atribuída a valores usando a função interna NEWID () que gera um valor exclusivo em cada chamada, que pode ser facilmente usado na instrução INSERT INTO, como abaixo:

Verificando a tabela de destino, você verá que um valor NULL é atribuído a essa coluna GUID para todas as colunas existentes anteriormente e um valor GUID exclusivo atribuído à coluna recém-inserida, usando a função NEWID (), como mostrado abaixo:

EX7

A instrução INSERT INTO pode ser usada para adicionar valores à tabela de destino de outra tabela de origem, na qual você precisa fornecer a lista de colunas na tabela de destino e as colunas relacionadas da tabela de origem que possuem os valores a serem atribuídos ao colunas da tabela de destino, como na instrução T-SQL abaixo:

A instrução INSERT INTO anterior é usada para copiar 10 registros de duas tabelas de origem com base na lógica fornecida, e os registros inseridos serão os seguintes:

EX8

Podemos modificar a instrução INSERT INTO anterior controlando o número de colunas inseridas usando a opção TOP na cláusula INSERT, em vez de controlá-la na instrução SELECT da tabela de origem, conforme mostrado abaixo:

E os 10 registros serão copiados da tabela de origem e inseridos na tabela inserida, conforme mostrado no resultado abaixo:

EX9

A instrução INSERT INTO também pode ser usada para adicionar linhas a uma tabela de banco de dados localizada em um servidor remoto usando a instrução OPENQUERY quando houver um servidor vinculado para se conectar ao SQL Server remoto ou usando a instrução OPENDATASOURCE usando uma cadeia de conexão específica, como em T -SQL abaixo:

E o novo registro será inserido nessa tabela de banco de dados remoto, como mostrado abaixo:

EX10

É bom mencionar que a cláusula OUTPUT pode ser usada com a instrução INSERT INTO para recuperar informações de cada linha adicionada pela instrução INSERT executada. Essas informações podem ser usadas posteriormente como uma mensagem de confirmação do aplicativo ou para fins de arquivamento de dados.

No exemplo abaixo, criamos uma tabela temporária para armazenar os nomes dos alunos inseridos, como nesta instrução T-SQL:

Consultando a tabela temporária, o nome do aluno inserido será exibido, como abaixo:

EX11

Ahmad Yaseen
Últimas mensagens de Ahmad Yaseen (ver todos)

[Video] Que porcentagem concluída é essa compilação de índice?


O SQL Server 2017 e mais recentes têm uma nova DMV, sys.index_resumable_operations, que mostra o percent_completion para criações e recriações de índice. Funciona, mas … somente se os dados não estiverem mudando. Mas é claro que seus dados é mudança – esse é o objetivo de realizar essas operações como retomadas. Se eles não estivessem mudando, poderíamos simplesmente terminar as operações.

Vamos ver como funciona para entender por que os números não são realmente confiáveis:

Bem, isso é … decepcionantemente impreciso.

Aqui estão os scripts de demonstração, se você quiser testar seus próprios sistemas:

Introdução aos relacionamentos muitos para muitos no SSAS

Cube Data Model


Neste artigo, explicarei quais são os relacionamentos muitos para muitos no SSAS e como implementá-los em um projeto do SQL Server Analysis Services (SSAS). Para fins deste artigo, consideraremos apenas o Cubo Multidimensional e não o Tabular. Além disso, este artigo pressupõe que você tenha algum conhecimento justo sobre a criação de cubos SSAS do zero.

Freqüentemente, na modelagem de dimensões e fatos, os desenvolvedores de BI enfrentam o problema de lidar com relacionamentos muitos-para-muitos no modelo de dados. Em um banco de dados SQL ou data warehouse, é mais fácil implementar o mesmo; no entanto, fica complicado quando o mesmo modelo também precisa ser implementado em um cubo multidimensional.

Noções básicas sobre relacionamentos muitos para muitos

Vamos primeiro entender o que são muitos para muitos. Considere um exemplo simples de Alunos e Classe. Como você sabe, um aluno pode se inscrever em uma ou mais classes e uma classe pode ter um ou mais de um aluno. Este é um exemplo simples de relacionamento muitos para muitos. Outros casos semelhantes podem ser considerados entre Produtos e clientes. Um cliente pode comprar um ou mais produtos, enquanto um produto pode ser comprado por um ou vários clientes.

No entanto, não podemos definir esses tipos de relacionamentos muitos para muitos diretamente no SQL. Para implementar essas relações muitos-para-muitos em um modelo de dados relacionais, precisamos introduzir um mesa intermediária que tenha relações um-para-muitos com ambas as entidades. Vamos entender seguindo a figura abaixo:

Exemplo de relacionamento muitos para muitos

Figura 1 – Exemplo de relação muitos para muitos

Se você vê na figura acima, a tabela intermediária da ponte, neste caso, é a “Inscrição“, Que tem uma relação muitos-para-um com ambos Alunos e a Classe mesas. Da mesma forma, essa abordagem pode ser considerada para o design de qualquer outro modelo de dados em que os relacionamentos muitos-para-muitos precisem ser implementados.

Implementando relacionamentos muitos para muitos no SSAS

Agora que temos alguma idéia, vamos implementar relacionamentos muitos para muitos no SSAS. Para fins de demonstração, vou usar o banco de dados AdventureWorksDW2017, conforme fornecido pela Microsoft. Esse banco de dados está disponível para download gratuito e você pode instalar o mesmo na sua máquina local. Nesse data warehouse, também existem relações muitos para muitos, que indicam o motivo da compra ou venda de um item. Por exemplo, uma venda pode ter um ou mais motivos vinculados a ela e um motivo de vendas também pode ser vinculado a várias vendas. No armazém, a tabela Fato é a “FactInternetSales”(marcado em amarelo) e as dimensões são “DimSalesReason“E”DimProduct”(marcado em azul) Embora existam muitas outras dimensões e fatos no armazém, ele está fora do escopo deste artigo e não será abordado aqui. A tabela de ponte é criada usando o “FactInternetSalesReason”(destacado em vermelho)

Modelo AdventureWorksDW para muitos para muitos relacionamentos em ssas

Figura 2 – Modelo do AdventureWorksDW

Vamos agora avançar e construir relacionamentos muitos para muitos no SSAS. Você pode seguir as etapas mencionadas abaixo e criar o projeto.

Criando o projeto SSAS

Crie um novo Projeto multidimensional no SSAS.

Conecte-o ao AdventureWorksDW2017 banco de dados e crie o Visualização da fonte de dados adequadamente.

No Assistente de exibição da fonte de dados que aparecer, selecione as quatro tabelas, conforme ilustrado na figura abaixo.

Assistente de exibição da fonte de dados

Figura 3 – Assistente de exibição da fonte de dados

Clique em Próximo e complete o assistente.

Concluindo o Assistente de Exibição da Fonte de Dados

Figura 4 – Concluindo o Assistente de exibição da fonte de dados

Quando a Visualização da fonte de dados estiver pronta, o próximo passo é criar o Dimensões.

Criando as dimensões

Clique com o botão direito do mouse no Dimensão e selecione Nova dimensão.

Adicionando nova dimensão para muitos e muitos relacionamentos em ssas

Figura 5 – Adicionando nova dimensão

Selecione Use uma tabela existente e clique em Próximo.

Usando uma tabela existente

Figura 6 – Usando uma tabela existente

Selecione DimProduct como mesa e Chave do produto Enquanto o Coluna da chave e clique em Próximo.

Especificar dimensão de origem

Figura 7 – Especifique a dimensão da fonte

Selecione Nome do produto em inglês como o atributo e clique em Próximo e termine o assistente.

Selecionando atributos de dimensão para DimProduct

Figura 8 – Selecionando atributos de dimensão para DimProduct

Conclua as etapas semelhantes para DimSalesReason e complete o assistente.

Selecionando atributos de dimensão para DimSalesReason

Figura 9 – Selecionando atributos de dimensão para DimSalesReason

Criando o cubo

Agora que as dimensões estão prontas, o próximo passo é criar o cubo.

Clique com o botão direito do mouse em Cubo e selecione New Cube:

Adicionar um novo cubo

Figura 10 – Adicionar novo cubo

Selecione FactInternetSales e FactInternetSalesReason como grupos de medidas e clique em Próximo.

Selecione Grupos de medidas

Figura 11 – Selecionar grupos de medidas

Selecione Quantidade de vendas e Contagem de motivos de vendas na Internet como medida e clique Próximo.

Selecionar medidas

Figura 12 – Selecionar medidas

Quando todas as etapas acima estiverem concluídas, clique em Terminar para concluir e fechar o assistente.

Conclua o assistente de cubo

Figura 13 – Conclua o assistente de cubo

O cubo agora está criado e você pode ver o modelo de dados da seguinte maneira.

Modelo de Dados do Cubo

Figura 14 – Modelo de dados do cubo

Depois que o cubo for criado, implante o cubo no servidor. Clique com o botão direito do mouse no cubo e selecione Implantar.

Implantar o cubo

Figura 15 – Implantar o cubo

E finalmente, clique Processo para processar o cubo:

Processar o cubo

Figura 16 – Processar o cubo

Agora que nosso cubo foi processado, navegue pelo cubo e veja quais são os resultados. Arraste e solte o botão “Nome do Motivo de Vendas“,”Quantidade de vendas“E”Contagem de motivos de vendas na Internet”No designer de consulta. Como você pode ver na imagem abaixo, os valores para o Valor das vendas são os mesmos por todos os motivos incorretos. O motivo desse erro é que as relações muitos-para-muitos entre as tabelas de fatos ainda não estão definidas.

Navegando no Cubo

Figura 17 – Navegando no cubo

Definindo relacionamentos muitos para muitos no SSAS

Vamos agora definir relacionamentos muitos para muitos no SSAS. Você pode seguir as etapas abaixo.

Adicione uma nova dimensão para SalesOrderNumber. Como essa é a coluna que vamos usar na coluna da ponte, precisamos criar uma dimensão separada para a mesma.

Adicionando a nova dimensão

Figura 18 – Adicionando a nova dimensão

Deixe a coluna chave ser a mais SalesOrderNumber. Conclua o assistente clicando em Próximo e finalmente Terminar.

Concluindo o assistente

Figura 19 – Concluindo o assistente

Depois que a dimensão é criada, a próxima etapa é adicionar essa nova dimensão ao cubo.

Clique com o botão direito do mouse no Dimensões e selecione Adicionar dimensão do cubo.

Adicionar uma dimensão de cubo

Figura 20 – Adicionar dimensão do cubo

Navegue até o Uso da dimensão guia, e você verá a nova dimensão agora disponível na lista. Selecione SalesOrderNumber adjacente ao FactInternetSales e clique na pequena caixa à direita. Na janela que se abre, selecione o Tipo de Relacionamento Como Facto.

Definindo o tipo de relação de fatos

Figura 21 – Definindo o tipo de relação de fato

Selecione o grupo de medidas FactInternetSalesReason para SalesReason. Clique na pequena caixa à direita e, na caixa de diálogo exibida, selecione o Tipo de relação Como Muitos para muitos.

Definindo muitos para muitos relacionamentos em ssas

Figura 22 – Definindo relacionamentos muitos para muitos

Navegando no Cubo

Agora que implementamos as alterações necessárias necessárias para estabelecer relacionamentos muitos-para-muitos no SSAS, agora podemos prosseguir e começar a navegar no cubo, como fizemos na etapa anterior.

Navegando no Cubo

Figura 23 – Navegando no cubo

Se você vir a figura acima, agora poderá ver que os valores do Valor das vendas estão sendo exibidos corretamente agora. Além disso, se você o comparar com o exemplo anterior, poderá ver que alguns dos campos que não tinham relações apropriadas também são eliminados do cubo.

Conclusão

Neste artigo, expliquei como podemos implementar relacionamentos muitos para muitos no SSAS. O design de modelos de dados que incluam relações muitos-para-muitos é bastante complexo e precisa ser definido adequadamente. Se as relações não forem definidas corretamente, isso poderá levar a dados incorretos e, finalmente, informações enganosas.

Atualizado Kit Primeiro Respondente e Kit de Ferramentas Consultor para março de 2020


Nas palavras imortais de “Orange” Julius Caesar, como escrito pelo colega de Shake, “Cuidado com os insetos de março”. Levamos 2.064 anos, mas finalmente corrigimos esses bugs e adicionamos alguns novos recursos.

Para obter a nova versão:

Alterações no kit de ferramentas do consultor

Atualizado o Kit do primeiro respondente com as atualizações de script deste mês.

Alterações sp_AllNightLog

  • Correção: ignore os bancos de dados em que ignore_database <> 0 na tabela backup_worker. (# 2308, obrigado Maxiwheat.)

Alterações no sp_Blitz

  • Correção: não erro quando alguns bancos de dados têm a rotatória numérica ativada, e um erro de arredondamento normalmente gera um erro. (# 2302, obrigado DJH.)
  • Correção: erro na verificação completa do backup: se o msdb.backupset contivesse backups feitos em outros servidores, nós os incluiríamos como backups bem-sucedidos quando eles realmente não estavam. (# 2313, obrigado Solomon Rutzky.)
  • Correção: o script de desinstalação agora funciona em agrupamentos que diferenciam maiúsculas de minúsculas. (# 2307, obrigado Protiguous.)

Alterações no sp_BlitzCache

  • Melhoria: adicionada uma nova verificação para o cache UserStore_TokenPerm ser> 10% do buffer pool. Estou vendo problemas fora do comum em que esse cache substituiu a memória e fez com que o SQL Server não conseguisse armazenar em cache nenhum plano de execução. Esse foi um problema há mais de uma década no SQL 2005, mas eu tenho um cliente do SQL Server 2016/2017 com um caso aberto com a Microsoft. Adicionaremos essa mesma verificação para sp_Blitz e sp_BlitzFirst. (# 2134, obrigado Erik Darling.)

Alterações sp_BlitzFirst

  • Correção: o @FilterPlansByDatabase estava lançando um erro se você passasse em uma lista de bancos de dados (em vez de apenas “usuário” para os bancos de dados do usuário.) (Nº 2311, obrigado Sam Carey.)

Alterações sp_BlitzLock

  • Melhoria: agora também captura deadlocks de paralelismo de consulta única. (# 2286, obrigado Adrian Buckman.)
  • Correção: agora funciona com o Amazon RDS SQL Server Express Edition, ignorando a consulta sysjobssteps, como fazemos com o Azure SQL DB. (# 2317, obrigado Ernesto-Ibanez.)

sp_BlitzWho Alterações

Para suporte

Quando você tiver dúvidas sobre como as ferramentas funcionam, converse com a comunidade no canal #FirstResponderKit Slack. Se você precisar de um convite grátis, pressione SQLslack.com. Seja paciente – ele é formado por voluntários que têm empregos diurnos.

Quando você encontrar um bug ou quiser algo alterado, leia o arquivo contribut.m.md.

Quando você tiver alguma dúvida sobre o que os scripts encontraram, primeiro leia o URL “Mais detalhes” para qualquer aviso que encontrar. Colocamos muito trabalho na documentação e não queremos que alguém grite com você para ler o manual. Depois disso, quando você ainda tiver dúvidas sobre como algo funciona no SQL Server, poste uma pergunta no DBA.StackExchange.com e a comunidade (que nos inclui!) Ajudará. Inclua erros exatos e quaisquer capturas de tela aplicáveis, o número da versão do SQL Server (incluindo o número da compilação) e a versão da ferramenta com a qual você está trabalhando.

Aprenda SQL: práticas de consulta SQL

SQL Practice - the data model we'll use in the article


Hoje é o dia da prática de SQL nº 1. Nesta série, até agora, abordamos os comandos SQL mais importantes (CREATE DATABASE & CREATE TABLE, INSERT, SELECT) e alguns conceitos (chave primária, chave estrangeira) e teoria (procedimentos armazenados, funções definidas pelo usuário, visualizações). Agora é hora de discutir algumas consultas SQL interessantes.

O Modelo

Vamos dar uma olhada rápida no modelo que usaremos nesta prática.

Prática de SQL - o modelo de dados que usaremos no artigo

Você pode esperar que, em situações da vida real (por exemplo, entrevista), tenha um modelo de dados à sua disposição. Caso contrário, você terá a descrição do banco de dados (tabelas e tipos de dados + descrição adicional do que é armazenado, onde e como as tabelas estão relacionadas).

A pior opção é que você deve verificar todas as tabelas primeiro. Por exemplo, você deve executar uma instrução SELECT em cada tabela e concluir o que é onde e como as tabelas estão relacionadas. Provavelmente isso não acontecerá na entrevista, mas poderá ocorrer na vida real, por exemplo, quando você continuar trabalhando em um projeto existente.

Antes de começarmos

O objetivo desta prática SQL é analisar algumas tarefas típicas nas quais você pode se deparar na entrevista. Outros lugares onde isso pode ajudá-lo são tarefas da faculdade ou a conclusão de tarefas relacionadas a cursos on-line.

O foco deve estar no entendimento do que é necessário e qual é o objetivo de aprendizado por trás dessa pergunta. Antes de continuar, sinta-se à vontade para atualizar seu conhecimento sobre INNER JOIN e LEFT JOIN, como associar várias tabelas, funções agregadas SQL e a abordagem de como escrever consultas complexas. Se você estiver pronto, vamos dar uma olhada nas 2 primeiras consultas (teremos mais algumas nos próximos artigos). Para cada consulta, descreveremos o resultado necessário, examinaremos a consulta, analisaremos o que é importante para essa consulta e examinaremos o resultado.

Prática SQL nº 1 – Agregação e junção esquerda

Crie um relatório que retorne uma lista de todos os nomes de países (em inglês), juntamente com o número de cidades relacionadas que temos no banco de dados. Você precisa mostrar todos os países e atribuir um nome razoável à coluna agregada. Ordene o resultado pelo nome do país em ordem crescente.

Vamos analisar as partes mais importantes desta consulta:

  • Usamos LEFT JOIN (LEFT JOIN cidade ON country.id = city.country_id) porque precisamos incluir todos os países, mesmo aqueles sem cidade relacionada

  • Devemos usar COUNT (city.id) AS number_of_cities e não apenas COUNT (*) AS number_of_cities Porque CONTAGEM(*) contaria se houver uma linha no resultado (LEFT JOIN cria uma linha, não importa se há dados relacionados em outra tabela ou não). Se contarmos o city.id, obteremos o número de cidades relacionadas

  • A última coisa importante é que usamos GRUPO POR country.id, country.country_name_eng em vez de usar apenas GRUPO POR country.country_name_eng. Em teoria (e na maioria dos casos), o agrupamento por nome deve ser suficiente. Isso funcionará bem se o nome estiver definido como ÚNICO. Ainda, incluir uma chave primária do dicionário, em casos semelhantes a este, é mais do que o desejado

Você pode ver o resultado retornado na figura abaixo.

combinando LEFT JOIN com função agregada

Prática 2 do SQL – Combinando subconsulta e função agregada

Escreva uma consulta que retorne o ID e o nome do cliente e o número de chamadas relacionadas a esse cliente. Retorne apenas clientes que tenham mais do que o número médio de chamadas de todos os clientes.

As coisas importantes que gostaria de enfatizar aqui são:

  • Observe que usamos funções agregadas duas vezes, uma na consulta “principal” e uma na subconsulta. Isso é esperado porque precisamos calcular esses dois valores agregados separadamente – uma vez para todos os clientes (subconsulta) e para cada cliente separadamente (consulta “principal”)

  • A função agregada na consulta “principal” é COUNT (call.id). Ele é usado na parte SELECT da consulta, mas também precisamos dela na parte HAVING da consulta (Observação: a cláusula HAVING está desempenhando o papel da cláusula WHERE, mas para valores agregados)

  • O grupo é criado pelo ID e pelo nome do cliente. Esses valores são os que precisamos ter no resultado

  • Na subconsulta, dividimos o número total de linhas (CONTAGEM(*)) pelo número de clientes distintos aos quais essas ligações estavam relacionadas (COUNT (DISTINCT customer_id)) Isso nos deu o número médio de chamadas por cliente

  • A última coisa importante aqui é que usamos o operador CAST (CAST (… COMO DECIMAL (5,2))) Isso é necessário porque o resultado final provavelmente seria um número decimal. Como os dois COUNTs são inteiros, o SQL Server também retornará um resultado inteiro. Para impedir que isso aconteça, precisamos CASTar o divisor e o divisor como números decimais

Vamos dar uma olhada no que a consulta realmente retornou.

Prática SQL - o resultado retornado pela subconsulta usando a função agregada

Conclusão

Na prática atual de SQL, analisamos apenas dois exemplos. Ainda assim, essas duas contêm algumas partes que você encontrará frequentemente em tarefas – seja no seu trabalho, seja em um teste (entrevista de emprego, tarefas na faculdade, cursos on-line etc.). Na próxima parte, continuaremos com algumas consultas mais interessantes que devem ajudá-lo a resolver problemas com os quais você pode se deparar.

Índice

Emil Drkusic
Últimas mensagens de Emil Drkusic (ver todos)

Movendo sua carga de trabalho SQL para a nuvem – Uma visão do SQLEspresso

Estou falando no Pass Summit 2019 - Uma foto do SQLEspresso


Todos os dias, mais organizações de TI decidem mover seus bancos de dados do SQL Server para o Azure. De fato, mais de um milhão de bancos de dados locais do SQL Server foram movidos para o Azure. Há um blog interessante sobre como a Microsoft é mais rápida e barata que seus concorrentes que vale a pena ler. Para ajudar na sua mudança para o Azure, a Microsoft oferece várias ferramentas e serviços de migração para tornar essa mudança o mais suave possível, o que acho que atribui ao sucesso deles. Duas dessas opções estão abaixo com alguns links informativos.

Se você estiver migrando várias instâncias grandes do SQL Server, o Serviço de Migração de Banco de Dados do Azure é a melhor maneira de migrar bancos de dados para o Azure em escala.

Você também pode automatizar as migrações de banco de dados usando os comandos do PowerShell do Serviço de Migração de Banco de Dados do Azure.

O Serviço de Migração de Banco de Dados do Azure (DMS) é um serviço totalmente gerenciado para migrar várias fontes de banco de dados para plataformas de dados do Azure em escala. Ele suporta o SQL Server 2005 através do SQL Server 2019, bem como uma variedade de outros pares de origem e destino. O Azure DMS permite uma migração perfeita com o mínimo de tempo de inatividade ou esforço.

Vamos ver como isso funciona.

Trabalhando com o Serviço de Migração de Banco de Dados do Azure

Uma migração de banco de dados típica usando o Serviço de Migração de Banco de Dados do Azure consiste nas seguintes etapas:

  1. Execute uma avaliação de migração usando o Data Migration Assistant (DMA). Observe todos os bloqueadores de migração relatados pelo DMA e execute as correções recomendadas.
  2. Se você precisar avaliar todo o conjunto de dados e encontrar a disponibilidade relativa dos bancos de dados migrando para o Azure SQL, siga as etapas fornecidas aqui.
  3. Depois de encontrar o destino SQL do Azure, use o Serviço de Migração de Banco de Dados do Azure para encontrar o SKU ideal de destino SQL do Azure que atenda às suas necessidades de desempenho.
  4. Crie seus bancos de dados de destino.
  5. Crie uma instância do Serviço de Migração de Banco de Dados do Azure.
  6. Crie um projeto de migração especificando os bancos de dados de origem, bancos de dados de destino e as tabelas a serem migradas.
  7. Inicie a carga completa. Nota: selecione Conectados para incluir backups do log de transações.
  8. Escolha a validação subsequente.
  9. Execute uma transição manual do seu ambiente de produção para o novo banco de dados do Azure.

Migração offline vs. online

A quantidade de tempo de inatividade necessária para migrar para a nuvem é sempre um aspecto importante na decisão de migrar para a nuvem ou não. O Serviço de Migração de Banco de Dados do Azure permite que você faça uma migração offline ou online. A diferença é a quantidade de tempo de inatividade. Com uma migração offline, o tempo de inatividade começa ao mesmo tempo em que a migração é iniciada. Com uma migração online, o tempo de inatividade é limitado ao tempo necessário para passar para o novo ambiente no final da migração.

A Microsoft recomenda testar uma migração offline. Se você não puder tolerar o tempo de inatividade, mude para uma migração online. É importante observar que uma migração on-line requer uma instância do nível de preços Premium. No entanto, eles facilitam o processo, oferecendo-o gratuitamente nos primeiros seis meses.

Sumário

O Serviço de Migração de Banco de Dados do Azure oferece uma idéia muito melhor do que esperar ao migrar grandes instâncias de banco de dados em escala. Ele migra seus bancos de dados com facilidade usando as práticas recomendadas da Microsoft. Ainda melhor é que a Microsoft investe continuamente em migrações trabalhando para melhorar a confiabilidade e o desempenho, além de adicionar pares de origem / destino. Eu posso ver facilmente por que eles continuam liderando as tecnologias em nuvem.

Para saber mais sobre como mover seus bancos de dados para a nuvem, aqui está um ótimo recurso. “Faça uma infraestrutura de dados à prova do futuro com o Azure: um caso de negócios para administradores de banco de dados.