Bonjour, je cherche à écrire une requête me remontant certaines données.
Pour garder cela dans les règles de l'art j'aimerai éviter d'utiliser un curseur, et peut-être du SQL dynamique (ça semble plus compliqué...)

Le besoin
J'ai besoin de compter les nombres de lignes présentes dans des tables selon la valeur d'un filtre disponible dans une autre du même schéma au nom toujours identique...

Je précise que je suis dans un contexte décisionnel, que les tables en question sont des tables de faits que je vide tous les jours et que chacun des tables de fait (ou presque) est dans un schéma différent..

Toutes les tables de faits ont une colonne DateId et chacun des schéma à une table RefDateProcess avec une colonne DateId.

Pour chacune des tables de fait je dois faire la jointure avec la table RefDateProcess correspondante sur cette date et compter le nombre de lignes.

Le tout est ensuite d'insérer ces valeurs de comptage dans une table de log.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
CREATE SCHEMA [sc1] AUTHORIZATION [dbo]
CREATE SCHEMA [sc2] AUTHORIZATION [dbo]
GO
 
CREATE TABLE sc1.Ft (DateId INT, Code VARCHAR(MAX))
CREATE TABLE sc2.Ft (DateId INT, Code VARCHAR(MAX))
CREATE TABLE sc1.RefDateProcess (DateId INT)
CREATE TABLE sc2.RefDateProcess (DateId INT)
GO
 
-- Ma liste de tables
select 
	sc.name, 
	tb.name
from 
	sys.tables tb
	JOIN sys.schemas sc
		ON sc.schema_id = tb.schema_id
where
	tb.name like 'Ft%'
 
 
-- Le comptage pour une table
select COUNT(ft.DateId)
from sc1.Ft ft
JOIN sc1.RefDateProcess ref
	ON ref.DateId = ft.DateId
Le tout est alors "d'intégrer" la seconde requête dans la première

Sachant que les tables de faits peuvent ne contenir aucune ligne bien sûr (ce que je chercher à repérer).

Tout cela sera ensuite intégré à un report qui contiendra une date, envoyée en paramètre à une procédure qui nettoies la table de logs sur la date de la RefDateProcess puis recompte le nombre de lignes.