União ou Use Flow Control lógica para determinar qual tabela para informar sobre
-
22-08-2019 - |
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
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.