Trabalhando com o SQL Server ROWCOUNT

ROWCOUNT - Example 11


Neste artigo, discutiremos os objetos do sistema SQL Server @@ ROWCOUNT e ROWCOUNT, seguindo as instruções práticas
    exemplos que cobrem a maioria desses objetos de sistema.

Uso

SQL Server @@ ROWCOUNT é uma variável de sistema usada para retornar o número de linhas afetadas pela última instrução executada no lote.

As linhas que afetam a instrução podem ser qualquer instrução INSERT, UPDATE, DELETE ou SELECT executada diretamente antes
    a execução @@ ROWCOUNT, levando em consideração que as linhas que afetam a instrução e a variável do sistema
    consulta de chamada estão na mesma execução.

@@ ROWCOUNT é usado com frequência nos loops para impedir os infinitos e parar o processo atual quando todas as linhas de destino são processadas. Também é usado para tratamento de erros para verificar o número de linhas afetadas na instrução.

Exemplos

Vamos analisar vários exemplos que mostram os diferentes cenários de uso de ROWCOUNT.

Número de linhas selecionadas

O uso simples da variável de sistema SQL Server @@ ROWCOUNT está chamando-a diretamente após uma instrução SELECT. No
    abaixo da consulta T-SQL, uma consulta SELECT é usada para recuperar os 100 principais registros da tabela Employee e na mesma
    Na execução, recuperamos o número de linhas lidas da tabela de origem, que é 100 linhas, como na
    exemplo, como mostrado abaixo:

Exemplo 1

Se tentarmos modificar a consulta anterior para recuperar os 1000 principais registros da tabela de destino, tente verificar o
    valor armazenado na variável de sistema SQL Server @@ ROWCOUNT, você verá que o valor retornado é 290, não 1000, como
    a instrução SELECT anterior leu todas as linhas da tabela de origem, que são apenas 290, como mostrado abaixo:

Exemplo 2

Se você executar duas instruções SELECT na mesma execução, seguidas chamando @@ ROWCOUNT, verá que ele retornará o número de linhas retornadas da segunda instrução SELECT. No script abaixo. O primeiro SELECT
    A instrução retornou 290 linhas e a segunda instrução SELECT retornou 296 linhas. O SQL Server @@ ROWCOUNT retornará
    296, que é o número de linhas afetadas pela segunda instrução SELECT, conforme mostrado abaixo:

Exemplo 3

Número de linhas atualizadas

A variável de sistema SQL Server @@ ROWCOUNT também pode ser usada para verificar o número de linhas afetadas por um
    Instrução UPDATE. No script a seguir, o valor da variável de sistema @@ ROWCOUNT, que reflete o número de
    linhas atualizadas por essa instrução, é recuperada na mesma execução da instrução UPDATE, conforme mostrado abaixo:

Exemplo 4

Número de linhas excluídas

Você também pode usar a variável de sistema SQL Server @@ ROWCOUNT para retornar o número de linhas afetadas pelo
    executou a instrução DELETE. No script abaixo, o valor da variável de sistema @@ ROWCOUNT, que reflete o
    O número de linhas excluídas pela instrução executada é recuperado na mesma execução da instrução DELETE, como
    segue:

Exemplo 5

Execução em lote

Nas execuções em lote, a variável de sistema SQL Server @@ ROWCOUNT armazenará o número de linhas afetadas pela última execução em lote. Por exemplo, se tentarmos executar uma instrução INSERT 20 vezes, usando a instrução GO 20,
    Em seguida, verifique o valor armazenado na variável de sistema @@ ROWCOUNT, você descobrirá que o valor é igual a 1. Isso ocorre porque cada instrução INSERT nesta consulta afeta apenas uma linha. Portanto, a última instrução INSERT inserirá uma linha
    em seguida, armazene esse número de linhas na variável do sistema, conforme mostrado abaixo:

Exemplo 6

O que acontecerá se eu chamá-lo em uma execução separada?

Uma coisa importante a considerar aqui é que, se você tentar executar uma consulta específica, chame o SQL Server @@ ROWCOUNT
    em uma execução diferente, o valor retornado não refletirá o número correto de linhas afetadas pela anterior
    consulta e retornará 1, que é o número de linhas afetadas pela instrução de chamada @@ ROWCOUNT, conforme mostrado abaixo:

Exemplo 7

Para controlar o fluxo

O SQL Server @@ ROWCOUNT pode ser usado na condição da instrução IF para controlar o fluxo da instrução, com base em
    o número de linhas retornadas da última instrução. Por exemplo, uma instrução SELECT é usada para recuperar um número de
    linhas da tabela de origem, uma declaração de condição IF é usada para verificar o número de linhas recuperadas dessa
    tabela e imprima um comentário relativo, como mostrado abaixo:

Exemplo 8

Controlar um loop

A variável de sistema SQL Server @@ ROWCOUNT também pode ser usada para controlar o loop e pará-lo quando o número de linhas
    corresponde à condição especificada e atinge um valor específico, evitando que caia em um loop infinito. No script
    abaixo, um loop WHILE continuará executando a instrução inteira, usada para excluir todas as linhas com GUIDs NULL em
    lotes e pare de executar quando o número de linhas que correspondem a essa condição for igual a 0, conforme mostrado abaixo:

Exemplo 9

Por que retorna zero?

No SQL Server, muitas instruções redefinirão o valor armazenado em @@ ROWCOUNT para 0. Essas instruções incluem DEALLOCATE
    CURSOR, CURSOR FECHADO, IMPRESSÃO, RAISERROR, INICIAR TRANSAÇÃO, CONFIRMAR TRANSAÇÃO, INICIAR TENT / CATCH ou END TRY / CATCH.

No script abaixo, executamos uma instrução SELECT dentro de um bloco TRY, mas essa instrução falhará devido à divisão por
    erro zero e outra instrução SELECT dentro do bloco CATCH será executada. Se tentarmos verificar o
    número de linhas afetadas pela consulta SELECT para identificar qual consulta SELECT é executada, veremos que o resultado
    retornado dessa variável é 0, pois é redefinido pelo bloco END CATCH, como mostrado abaixo:

EXEMPLO 10

Para superar esse problema, precisamos armazenar o número de linhas afetadas em outra variável imediatamente após a execução de cada instrução, para usar esse valor posteriormente.

No script a seguir, definimos uma variável e armazenamos o número de linhas nessa variável após o comando SELECT
    instruções executadas dentro dos blocos TRY e CATCH, em seguida, retorne a variável de usuário, onde ela refletirá o número de linhas afetadas pela consulta SELECT dentro do bloco CATCH, como mostrado abaixo:

Exemplo 11

Número de linhas> 2 bilhões!

A variável de sistema SQL Server @@ ROWCOUNT não funcionará se o número de linhas afetadas pela consulta exceder os 2
    bilhão de linhas. Isso ocorre porque o tipo de dados dessa variável de sistema é INT.

Para superar esse problema, o SQL Server apresenta a função do sistema ROWCOUNT_BIG, que retorna o número de linhas afetadas por um
    consulta específica no tipo de dados BIGINT.

Pode ser chamado diretamente após a declaração que você está interessado em verificá-la, como mostrado claramente abaixo:

Exemplo 12

Controlar o número de linhas

SET ROWCOUNT é um objeto do sistema que força o SQL Server Engine a interromper o processamento da consulta após o retorno do número especificado de linhas, o que é de alguma forma semelhante à cláusula TOP!

A Microsoft não recomenda o uso de SET ROWCOUNT com instruções DELETE, INSERT e UPDATE e usa a sintaxe TOP, pois não afetará essas instruções em uma versão futura do SQL Server.

No script abaixo, o SET ROWCOUNT é usado para substituir a palavra-chave TOP na instrução SELECT e limitar o número de linhas a um valor menor, onde a consulta SELECT retornará apenas 10 registros, conforme mostrado abaixo:

Exemplo 13

Você pode desativar o ROWCOUNT e permitir que a instrução retorne todas as linhas, definindo seu valor como 0. Por exemplo,
    a instrução SELECT abaixo retornará as 200 linhas, sem ser limitada pelo número específico de linhas, como mostrado
    abaixo:

Exemplo 14

SET ROWCOUNT também pode ser usado para limitar o número de linhas excluídas, o que não é recomendado. No script abaixo, nós
    podemos ver que o número de linhas que correspondem à condição especificada é 30 e usamos o SET ROWCOUNT para excluir
    apenas 5 linhas, como mostrado abaixo:

EXEMPLO 15

Como o SET ROWCOUNT será descontinuado para as instruções INSERT, UPDATE e DELETE, podemos substituí-lo facilmente por
    sintaxe TOP e exclua apenas 5 linhas, como mostrado abaixo:

EXEMPLO 16

Conclusão

Exploramos os objetos do sistema SQL Server @@ ROWCOUNT e ROWCOUNT passando por vários exemplos neste artigo.
    Essa variável de sistema retorna o número de linhas afetadas pela última instrução executada no lote e é
    extremamente benéfico em loops e manipulação de erros.

Ahmad Yaseen
Últimas mensagens de Ahmad Yaseen (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)

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.

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.

Semana gratuita de Fundamentos da Consulta de consultas: Parte 4, Melhorando a precisão da estimativa de cardinalidade


/ *

Fundamentos do ajuste de consulta: aprimorando a precisão da estimativa de cardinalidade

v1.0 – 2019-06-30

https://www.BrentOzar.com/go/queryfund

Esta demonstração requer:

* Qualquer versão suportada do SQL Server

* Qualquer banco de dados Stack Overflow: https://www.BrentOzar.com/go/querystack

Este primeiro RAISERROR é apenas para garantir que você não acerte F5 acidentalmente.

execute o script inteiro. Você não precisa executar isso:

* /

RAISERROR(N‘Opa! Não, nãobasta pressionar F5. Execute essas demos uma de cada vez., 20, 1) COM REGISTRO;

IR

/ * Estou usando o banco de dados Stack médio de 50 GB: * /

USAR StackOverflow2013;

IR

/ * E este procedimento armazenado descarta todos os índices não clusterizados: * /

DropIndexes;

IR

/ * Ative os planos de execução reais: * /

SELECT Localização, CONTAGEM(*)

A PARTIR DE dbo.Comercial

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC

IR

/ *

Coisas para pensar:

* Como foram as estimativas de linha para cada operador?

* Quando eles começaram a dar errado e por quê?

* Que impacto isso teve nos operadores upstream?

Quais são algumas das maneiras pelas quais podemos melhorar a precisão da estimativa?

* Atualizar estatísticas

* Crie um índice

* OPÇÃO RECOMPLETA

* Diferentes níveis de compatibilidade

* Adicione um TOP

* /

/ *

A cardinalidade não se refere apenas à contagem de linhas:

também é sobre o conteúdo da linha.

* /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation_CTE COMO

INÍCIO

COM TopLocation COMO (SELECT TOPO 1 Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC)

SELECT você.*

A PARTIR DE TopLocation

INTERIOR JUNTE-SE dbo.Comercial você EM TopLocation.Localização = você.Localização

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation_CTE

IR

/ * Uma subconsulta é diferente? * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation_Subquery COMO

INÍCIO

SELECT *

A PARTIR DE dbo.Comercial você

ONDE Localização = (SELECT TOPO 1 Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC)

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation_Subquery

IR

/ *

E se colocarmos o conteúdo do CTE em uma variável primeiro?

* /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation

IR

/ *

Coisas para pensar:

* Construir um plano e executar um plano são duas fases separadas

* O lote inteiro (proc) é compilado de uma só vez

* Às vezes, precisamos que a compilação aconteça mais tarde

* /

/ * Recompilar no nível da instrução * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição

OPÇÃO (RECOMPILE);

FIM

IR

EXEC usp_UsersInTopLocation

IR

/ * Recompilar no nível do processo * /

CRIO OU ALTERAR PROC dbo.usp_UsersInTopLocation COM RECOMPILE COMO

INÍCIO

DECLARAR @TopLocation NVARCHAR(100);

SELECT TOPO 1 @TopLocation = Localização

A PARTIR DE dbo.Comercial

ONDE Localização <>

GRUPO POR Localização

ORDEM POR CONTAGEM(*) DESC;

SELECT *

A PARTIR DE dbo.Comercial

ONDE Localização = @TopLocation

ORDEM POR Nome em Exibição;

FIM

IR

EXEC usp_UsersInTopLocation

IR

/ *

Para recapitular, a cardinalidade é sobre:

* Quantas linhas um operador lançará

* O conteúdo dessas linhas também

Comece no operador superior direito em cada plano. Quando as estimativas estão> 10x fora,

precisamos descobrir como podemos obter essa estimativa mais precisa, porque

o resto dos operadores a montante provavelmente está ferrado.

Agora é sua vez. Melhore as estimativas desta consulta:

* /

CRIO OU ALTERAR PROC [[dbo].[[usp_rpt_ControversialPosts] COMO

INÍCIO

/ * Fonte: http://data.stackexchange.com/stackoverflow/query/466/most-controversial-posts-on-the-site * /

conjunto Não conta em

declarar @VoteStats mesa (PostId int, acima int, baixa int);

inserir @VoteStats

selecionar

PostId,

acima = soma(caso quando VoteTypeId = 2 então 1 outro 0 0 fim),

baixa = soma(caso quando VoteTypeId = 3 então 1 outro 0 0 fim)

a partir de Votos

Onde VoteTypeId dentro (2,3)

grupo por PostId;

selecionar topo 500 p.Eu iria Como [[Postar Ligação] , v.acima, v.baixa

a partir de @VoteStats v

Junte-se Postagens p em PostId = p.Eu iria

Onde v.baixa > (v.acima * 0,5) e p.CommunityOwnedDate é nulo e p.FechadoData é nulo

ordem por v.acima desc;

FIM

IR

/ *

Licença: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0)

Mais informações: https://creativecommons.org/licenses/by-sa/3.0/

Você é livre para:

* Compartilhar – copie e redistribua o material em qualquer meio ou formato

* Adapte – remixe, transforme e desenvolva o material para qualquer finalidade, inclusive

comercialmente

Sob os seguintes termos:

* Atribuição – você deve dar o crédito apropriado, fornecer um link para a licença,

e indicar se foram feitas alterações.

* ShareAlike – Se você remixar, transformar ou desenvolver o material, deverá

distribua suas contribuições sob a mesma licença que o original.

* /

Usando arquivos de script C # externos no Biml

Adding a C# file to the solution


No artigo publicado anteriormente, Estendendo o Biml com scripts C #, explicamos como usar scripts VB ou C # dentro do código Biml para impedir o trabalho repetitivo de desenvolvimento. Mas nesta solução, os scripts e classes C # estão disponíveis apenas em um único arquivo, enquanto podemos precisar usá-los em muitos.

Neste artigo, explicaremos como armazenar esses scripts VB ou C # em arquivos externos e usá-los nos scripts Biml. Além disso, mencionaremos como criar métodos de extensão dentro desses scripts C #.

Adicionando scripts VB ou C #

Para adicionar scripts externos, precisamos ir para a faixa de menu “Extensões”, “BimlExpress” e clicar em “Adicionar novo arquivo C #” ou “Adicionar novo arquivo VB” com base no idioma que precisamos usar:

Adicionando um arquivo C # à solução

Figura 1 – Adicionando um novo arquivo C #

Depois de clicar nesse botão, um novo arquivo C # é adicionado à solução:

Arquivo C # incluído dentro do Solution Explorer

Figura 2 – arquivo C # adicionado na solução

Definindo um método dentro da classe C #

Neste exemplo, usaremos essa classe C # para definir um método que gera um identificador global (GUID) a ser usado dentro de uma transformação de coluna derivada. Abrimos o arquivo e importamos o espaço para nome do sistema. Em seguida, adicionamos o seguinte código:

Usando o arquivo C # no Biml

Para começar, usaremos o código Biml que desenvolvemos no artigo Extending Biml with C # scripts.

Primeiro, precisamos importar o arquivo C # usando um bloco de diretiva colocado fora do principal elemento da seguinte forma:

Então, quando precisarmos usar qualquer método definido neste arquivo, devemos escrever o nome da classe e do método (ou seja, MyClass.GetNewGuid ()).

Voltar ao código Biml que desenvolvemos anteriormente. Se precisarmos usar o método C # na expressão Coluna Derivada, devemos usar um bloco de texto onde implementamos este método:

Se dermos uma olhada na janela de código compilado, podemos ver que um novo identificador global é avaliado para a transformação da coluna derivada (observe que esses exemplos podem não funcionar no mundo real, pois o GUID gerado não será alterado para todas as linhas importadas e não é gerado por linha).

mostrando como o método auxiliar é avaliado ao usar dentro de uma expressão de colum derivada

Figura 3 – Mostrando o valor retornado pelo método após a compilação

Como podemos ver no código, adicionamos manualmente o nome do esquema nos componentes de origem e destino do OLE DB, pois o “con.GetDatabaseSchema ()” retorna apenas o nome da tabela.

Agora, adicionaremos um script C # que usa o TableNode como parâmetro e retornar um nome completo (esquema + tabela):

Agora, implementaremos esse método no código Biml da seguinte maneira:

Se verificarmos a janela de código compilado, veremos que obtemos o nome completo da tabela:

mostrando como o método auxiliar é avaliado no código Biml compilado

Figura 4 – Método retornando o nome completo da tabela

Criando um método de extensão

No exemplo anterior, criamos um método relacionado ao objeto TableNode em uma classe diferente. Mas e se adicionarmos vários arquivos de script externos, os métodos de rastreamento nas classes serão mais difíceis cada vez que uma nova classe for adicionada. Para resolver esse problema, podemos criar métodos externos que aparecerão na classe TableNode (método de extensão). Se você não conhece os métodos de extensão, pode consultar um dos seguintes artigos para saber mais sobre essa tecnologia:

Para criar um método de extensão, devemos adicionar a palavra-chave “this” antes do tipo de dados do parâmetro do método, da seguinte maneira:

O código inteiro deve se parecer com o abaixo:

Agora, dentro do código Biml, podemos chamar esse método usando a seguinte linha de bloco de texto:

Na captura de tela abaixo, podemos ver como esse método é avaliado após a compilação:

mostrando como o método de extensão é avaliado no código Biml compilado

Figura 5 – Avaliação do método de extensão

Conclusão

Neste artigo, explicamos como usar scripts C # externos no código Biml (usando classes e métodos Helper), também mencionamos como converter esses métodos auxiliares em métodos de extensão.

Por enquanto, acho que este é o último artigo sobre o uso do Biml para gerar e controlar pacotes do SQL Server Integration Services (SSIS) nesta série. Se você está procurando uma boa referência para aprender o Biml, pode consultar os links que fornecemos no artigo Introdução ao Biml ou o incrível blog de Catherine Wilhelmsen, que é um dos principais especialistas neste domínio.

Índice

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