Pergunta

Eu estou trabalhando com um aplicativo pary 3ª onde não é possível alterar as tabelas. Nós construímos correspondência personalizada tabelas "Mensal" com uma coluna de data e hora adicional "AsOfDate" onde despejar os dados no final do mês e bandeira esses dados com a data do último dia do mês.

Eu quero ser capaz de criar uma única (aplicativo é projetado para exigir uma vista ou procedimento armazenado como a fonte de todos os relatórios.) Stored Procedure e usar um parâmetro que irá usar o tabela de dados atual (Parâmetro pode ser NULL ou = data de hoje) ou usar a tabela no final do mês e filtro até o final da data mês. Desta forma, eu tenho um relatório onde o usuário pode usar corrente ou dados de um período no final do mês particular.

O que você prefere (e por que) Desculpe, isso não é totalmente codificado

Solução # 1 consulta união

Create Proc Balance_Report (@AsOfDate)
AS

Select Column1
From
    (Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
    Union 
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    ) AS All_Balances
Where All_Balances.AsOfDate = @AsOfDate

Solução # 2 Use if para selecionar a tabela

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Select GetDate() as AsOfDate
       , Column1 
     From Current.Balance
Else
    Select AsOfDate
       , Column1 From MonthEnd.Balance
    Where AsOfDate = @AsOfDate

Mais uma vez, isso não é totalmente codificado e é uma espécie de agnóstico db (Mas é SQL Server 2005).

Editar: Variação para a Solução # 2 utilizando procedimentos armazenados separados

Create Proc Balance_Report (@AsOfDate)
AS

If @AsOfDate IS NULL or @AsOfDate = GetDate()
   Exec Current_Balance_Date -- no param necessary
Else
    exec MonthEnd_Balance_Date @AsOfDate
Foi útil?

Solução

Como você tem coisas criadas, o segundo método irá provavelmente ser mais rápido. Se você tivesse que usar uma exibição particionado, então você pode configurar restrições de tal forma que o otimizado saberia ignorar uma ou mais das tabelas no seleto e você deseja obter o mesmo desempenho. Isso também iria deixá-lo manter toda a sua lógica em uma instrução em vez de ter que manter duas declarações em sincronia. Isso pode ou não ser um problema para você com base em quão complexa a instrução SELECT é.

Uma coisa a lembrar, porém, é que se você usar o segundo método, certifique-se de marcar o seu procedimento armazenado como COM (RECOMPILE) (não me lembro se os parênteses são exigem ou não - verificar a sintaxe). Dessa forma, o otimizador irá criar um novo plano de consulta com base em qual ramo da IF necessidades de instrução a ser executada.

Outras dicas

Eu prefiro a solução não-união. A seleção de uma única tabela será sempre mais rápido do que fazer uma união e selecionar dados de uma única tabela a partir da união.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top