Eu tenho várias tabelas que normalmente possuem colunas de data e hora "CreatedDate" e/ou "ModifiedDate" anuláveis. Eu gostaria de uma consulta que pudesse selecionar qualquer tabela única onde existisse uma, ambas ou nenhuma coluna de data e hora e cada coluna recebesse BETWEEN
intervalos (separados).
Aqui está um exemplo aproximado (não funcional). Isso tenta usar COL_LENGTH
para determinar se existe uma coluna. Porém, se uma coluna não estiver presente, será gerado um erro, acredito porque o todo WHERE
ainda é avaliado.
SELECT * FROM tableName
WHERE 1=1 AND
(COL_LENGTH(tableName, 'CreatedDate') IS NULL OR CreatedDate BETWEEN @CreatedFrom AND @CreatedTo) AND
(COL_LENGTH(tableName, 'ModifiedDate') IS NULL OR ModifiedDate BETWEEN @ModifiedFrom AND @ModifiedTo)
Isso pode ser resolvido com SQL dinâmico. No entanto, neste caso estou restrito a permissões focadas na leitura. Portanto, não EXEC, CREATE ou INSERT.
Isso é possível com SQL estático?
Tabelas de exemplo
Com ambas as colunas:
DECLARE @Table1 table
(
Id int NOT NULL,
CreatedDate datetime NULL,
ModifiedDate datetime NULL
);
INSERT @Table1
(Id, CreatedDate, ModifiedDate)
VALUES
(1, NULL, NULL),
(2, NULL, '20230101 01:23:45.678'),
(3, '20230101 02:34:56.789', NULL),
(4, '20230101 03:45:00.891', '20230101 04:56:00.789');
DECLARE
@CreatedFrom datetime = {TS '2023-01-01 01:30:00.000'},
@CreatedTo datetime = {TS '2023-12-31 23:30:00.000'},
@ModifiedFrom datetime = {TS '2023-01-01 06:00:00.000'},
@ModifiedTo datetime = {TS '2023-12-31 18:00:00.000'};
Com uma coluna:
DECLARE @Table2 table
(
Id int NOT NULL,
CreatedDate datetime NULL
);
INSERT @Table2
(Id, CreatedDate)
VALUES
(1, NULL),
(2, '20230101 02:34:56.789');
DECLARE
@CreatedFrom datetime = {TS '2023-01-01 01:30:00.000'},
@CreatedTo datetime = {TS '2023-12-31 23:30:00.000'};
Obrigado @PaulWhite pelo exemplo inicial .
Sim, esse problema complicado pode ser resolvido em SQL simples, com um método bastante obscuro.
Para uma explicação mais detalhada e a ideia original, veja as respostas de Andriy M e minhas em duas perguntas semelhantes:
Por que não posso usar uma instrução case para ver se existe uma coluna e não selecionar a partir dela?
Como selecionar linhas específicas se existir uma coluna ou todas as linhas se não existir uma coluna
No seu caso - e com as suposições
Isso funcionaria:
É possível usar XML para isso: