OVH Cloud OVH Cloud

Organisation des tables, variabiliser base dans ps

2 réponses
Avatar
thierry
Bonjour ,

je venais vers vous pour deux choses :

- La première concerne l'organisation des données dans les tables :
quels sont les avantages et inconvénients de stocker des données
mensuelles en colonne plutot qu'en ligne.
C'est à dire la différence entre :

MOIS1 MOIS2 MOIS3 MOIS4 MOIS5 MOIS6 ..... MOIS12 ANNEE
1 1 1 1 1 1 1 2003
1 1 1 1 1 1 1 2004


et :

VALEUR MOIS ANNEE
1 1 2003
1 2 2003
1 3
1 4
1 5

etc ...

- la deuxième concerne l'utilisation d'une variable base dans une
procédure stockée:

le but est de lancer une procédure stockée qui prend en paramètre le nom
de la base , le nom de la table et crée ainsi cette table dans la base


CREATE PROC Table_space_analysis @base varchar(20), @table varchar(20)
AS

exec ('USE' + @base) '' CA NE MARCHE PAS
DECLARE @TABLE varchar(50);
DECLARE c CURSOR FOR
SELECT name FROM sysobjects where type = 'U'
OPEN c
-- COMME LE USE NE FONCTIONNE PAS IL FAUT QUE JE DISE DANS QUELLE BASE
-- JE TRAVAILLE. POUR CELA JE VAIS PREFIXER LA TABLE PAR LE NOM DE LA
-- BASE MAIS CA NE FONCTIONNE PAS


IF EXISTS EXEC'(SELECT TABLE_NAME FROM ' + @BASE +
'INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = ' + @TABLE + ')'
BEGIN
DROP TABLE @BASE + '..' + @TABLE
END

create table @BASE + '..' + @TABLE
(
tbl_nom varchar(40),
tbl_lignes varchar(40),
tbl_reserved varchar(40),
tbl_data varchar(40),
tbl_index_size varchar(40),
tbl_unused varchar(40),
tbl_date datetime
)



Vous l'aurez compris , le but de cette ps est de créer une table dans
chaque base et d'y stocker des informations de volumétrie.

Je vous remercie d'avance pour votre aide.
srmt
thierry

2 réponses

Avatar
Patrice
1)
Il est bien plus simple de traiter des infos stockées sous une forme
"normalisée". Par exemple pour obtenir les mois où une valeur dépasse 100,
une requête comme :

SELECT * FROM MaTable WHERE Valeur>100 devient :
SELECT * FROM MaTable WHERE Mois1>100 OR Mois2>100 OR Mois3>100 OR Mois4>100
etc..

De plus cela ramène la/les lignes concernées mais il faut encore examiner
les colonnes pour voir lesquelles sont concernées...

Que se passe t'il si l'on doit sotkcer plusieurs valeurs pour chaque mois,
il faut alors créer 12 colonnes de plus etc etc...

On veut bien interroger un mois individuellement donc une ligne=un mois (et
non pas une année) de même que l'on ne stockerait pas des valeurs attachées
à des départements en créant une colonne pour chaque département.

La confusion vient sans doute du fait que c'est souvent une réprésentation
pratique pour une liste de mois mais c'est bien uniquement une question de
présentation et non pas de stockage.

2) Tout mettre dans une chaine unique et exécuter toute la chaîne (EXECUTE
ouvre un "contexte" qui lui est propre, le USE exécuté dynamiquement n'a
donc aucun effet en dehors du EXECUTE)

Patrice




"thierry" a écrit dans le message de
news:
Bonjour ,

je venais vers vous pour deux choses :

- La première concerne l'organisation des données dans les tables :
quels sont les avantages et inconvénients de stocker des données
mensuelles en colonne plutot qu'en ligne.
C'est à dire la différence entre :

MOIS1 MOIS2 MOIS3 MOIS4 MOIS5 MOIS6 ..... MOIS12 ANNEE
1 1 1 1 1 1 1 2003
1 1 1 1 1 1 1 2004


et :

VALEUR MOIS ANNEE
1 1 2003
1 2 2003
1 3
1 4
1 5

etc ...

- la deuxième concerne l'utilisation d'une variable base dans une
procédure stockée:

le but est de lancer une procédure stockée qui prend en paramètre le nom



de la base , le nom de la table et crée ainsi cette table dans la base


CREATE PROC Table_space_analysis @base varchar(20), @table varchar(20)
AS

exec ('USE' + @base) '' CA NE MARCHE PAS
DECLARE @TABLE varchar(50);
DECLARE c CURSOR FOR
SELECT name FROM sysobjects where type = 'U'
OPEN c
-- COMME LE USE NE FONCTIONNE PAS IL FAUT QUE JE DISE DANS QUELLE BASE
-- JE TRAVAILLE. POUR CELA JE VAIS PREFIXER LA TABLE PAR LE NOM DE LA
-- BASE MAIS CA NE FONCTIONNE PAS


IF EXISTS EXEC'(SELECT TABLE_NAME FROM ' + @BASE +
'INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = ' + @TABLE + ')'
BEGIN
DROP TABLE @BASE + '..' + @TABLE
END

create table @BASE + '..' + @TABLE
(
tbl_nom varchar(40),
tbl_lignes varchar(40),
tbl_reserved varchar(40),
tbl_data varchar(40),
tbl_index_size varchar(40),
tbl_unused varchar(40),
tbl_date datetime
)



Vous l'aurez compris , le but de cette ps est de créer une table dans
chaque base et d'y stocker des informations de volumétrie.

Je vous remercie d'avance pour votre aide.
srmt
thierry




Avatar
thierry
Bonjour,

tout d'abord je ne comprends pas car j'avais formulé une réponse hier
mais elle n'a pas été postée. Car j'avais renvoyée la réponse uniquement
à Patrick . J'ai donc copié le message mais cela a annulé l'indentation,
dsl.




Patrice wrote:
1)
Il est bien plus simple de traiter des infos stockées sous une forme
"normalisée". Par exemple pour obtenir les mois où une valeur dépasse 100,
une requête comme :

SELECT * FROM MaTable WHERE Valeur>100 devient :
SELECT * FROM MaTable WHERE Mois1>100 OR Mois2>100 OR Mois3>100 OR Mois4>100
etc..

De plus cela ramène la/les lignes concernées mais il faut encore examiner
les colonnes pour voir lesquelles sont concernées...

Que se passe t'il si l'on doit sotkcer plusieurs valeurs pour chaque mois,
il faut alors créer 12 colonnes de plus etc etc...

On veut bien interroger un mois individuellement donc une ligne=un mois (et
non pas une année) de même que l'on ne stockerait pas des valeurs attachées
à des départements en créant une colonne pour chaque département.

La confusion vient sans doute du fait que c'est souvent une réprésentation
pratique pour une liste de mois mais c'est bien uniquement une question de
présentation et non pas de stockage.

Je suis d'accord avec toi, tu confirmes ce que je pensais aussi.
La débat comme quoi mettre en colonne plutot qu'en ligne prend moins de
place est faux, non ?



2) Tout mettre dans une chaine unique et exécuter toute la chaîne (EXECUTE
ouvre un "contexte" qui lui est propre, le USE exécuté dynamiquement n'a
donc aucun effet en dehors du EXECUTE)

Oui mais c'est ce que j'avais essayé :
exec ('USE' + @base)
mais ce n'est pas pris en compte.

srmt
thieery


Patrice




"thierry" a écrit dans le message de
news:

Bonjour ,

je venais vers vous pour deux choses :

- La première concerne l'organisation des données dans les tables :
quels sont les avantages et inconvénients de stocker des données
mensuelles en colonne plutot qu'en ligne.
C'est à dire la différence entre :

MOIS1 MOIS2 MOIS3 MOIS4 MOIS5 MOIS6 ..... MOIS12 ANNEE
1 1 1 1 1 1 1 2003
1 1 1 1 1 1 1 2004


et :

VALEUR MOIS ANNEE
1 1 2003
1 2 2003
1 3
1 4
1 5

etc ...

- la deuxième concerne l'utilisation d'une variable base dans une
procédure stockée:

le but est de lancer une procédure stockée qui prend en paramètre le nom


de la base , le nom de la table et crée ainsi cette table dans la base


CREATE PROC Table_space_analysis @base varchar(20), @table varchar(20)
AS

exec ('USE' + @base) '' CA NE MARCHE PAS
DECLARE @TABLE varchar(50);
DECLARE c CURSOR FOR
SELECT name FROM sysobjects where type = 'U'
OPEN c
-- COMME LE USE NE FONCTIONNE PAS IL FAUT QUE JE DISE DANS QUELLE BASE
-- JE TRAVAILLE. POUR CELA JE VAIS PREFIXER LA TABLE PAR LE NOM DE LA
-- BASE MAIS CA NE FONCTIONNE PAS


IF EXISTS EXEC'(SELECT TABLE_NAME FROM ' + @BASE +
'INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = ' + @TABLE + ')'
BEGIN
DROP TABLE @BASE + '..' + @TABLE
END

create table @BASE + '..' + @TABLE
(
tbl_nom varchar(40),
tbl_lignes varchar(40),
tbl_reserved varchar(40),
tbl_data varchar(40),
tbl_index_size varchar(40),
tbl_unused varchar(40),
tbl_date datetime
)



Vous l'aurez compris , le but de cette ps est de créer une table dans
chaque base et d'y stocker des informations de volumétrie.

Je vous remercie d'avance pour votre aide.
srmt
thierry