Organisation des tables, variabiliser base dans ps
2 réponses
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 :
- 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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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 :
- 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
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
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" <demas@free.fr> a écrit dans le message de
news:407683E1.5060307@free.fr...
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 :
- 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
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 :
- 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
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
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 :
- 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
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
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" <demas@free.fr> a écrit dans le message de
news:407683E1.5060307@free.fr...
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 :
- 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
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 :
- 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