OVH Cloud OVH Cloud

Déplacer une colonne

10 réponses
Avatar
rodolphe rebeyrotte
D=E9placer une colonne d'une table par script:

j'ai ajout=E9 un colonne =E0 une table (ALTER TABLE...)
mais cette colonne est ajout=E9e =E0 la fin de la table
D'o=F9, existe t-il un script pour d=E9placer, positionner une=20
colonne dans une table

pourquoi cette question : Je souhaite faire un migration=20
de base et avoir une structure de base de donn=E9es "Propre"!

10 réponses

Avatar
Vuillermet Jacques
Je propose une voie :

/* Création d'une table avec bon ordre */
CREATE TABLE MaTableNew
(
... bon ordre de colonne
)

/* Alimentation */
INSERT INTO MaTableNew ( [bon ordre] )
SELECT ...[bon ordre]
FROM MaTable

/* Mise à jour */
DROP TABLE MaTable
sp_rename 'MaTableNew', 'MaTable'

...au détail d'implémentation près (trigger, contraintes, index, ...) !

Jacques.

"rodolphe rebeyrotte" a écrit dans le
message de news: 42b401c3e3f9$2e7d95d0$
Déplacer une colonne d'une table par script:

j'ai ajouté un colonne à une table (ALTER TABLE...)
mais cette colonne est ajoutée à la fin de la table
D'où, existe t-il un script pour déplacer, positionner une
colonne dans une table

pourquoi cette question : Je souhaite faire un migration
de base et avoir une structure de base de données "Propre"!
Avatar
el.c. - myLittleTools.net
Il s'agit même de la seule solution
Mais il est bon de rappeler que l'order des colonnes dans une table n'a
aucune incidence sur les performances ou le mcd. En clair, ce n'est
qu'une question d' "esthétique".

el.c.

--
// myLittleTools.net : leading provider of web-based applications.
// myLittleAdmin : online MS SQL manager
// http://www.mylittletools.net
//

Je propose une voie :

/* Création d'une table avec bon ordre */
CREATE TABLE MaTableNew
(
... bon ordre de colonne
)

/* Alimentation */
INSERT INTO MaTableNew ( [bon ordre] )
SELECT ...[bon ordre]
FROM MaTable

/* Mise à jour */
DROP TABLE MaTable
sp_rename 'MaTableNew', 'MaTable'

...au détail d'implémentation près (trigger, contraintes, index, ...)
!

Jacques.

"rodolphe rebeyrotte" a écrit
dans le message de news: 42b401c3e3f9$2e7d95d0$
Déplacer une colonne d'une table par script:

j'ai ajouté un colonne à une table (ALTER TABLE...)
mais cette colonne est ajoutée à la fin de la table
D'où, existe t-il un script pour déplacer, positionner une
colonne dans une table

pourquoi cette question : Je souhaite faire un migration
de base et avoir une structure de base de données "Propre"!


Avatar
rodolphe rebeyrotte
Finalement j'ai trouvé la solution à mon problème

Tu peux executer

Update INFORMATION_SCHEMA.COLUMNS
set ORDINAL_POSITION = LeNouveauRang
where TABLE_NAME='ma table'
AND COLUMN_NAME ='ma colonne'

attention il y a un index unique donc il faut être sur que
le rang est libre.

pour ce faire il faut activer l'option "Autoriser les
modifications directes dans les catalogues du système" sur
l'onglet "paramètres du serveur" des propriétés du serveur
Avatar
Vuillermet Jacques
Je n'ai pas osé penser à cette solution ayant trop peur d'impacts de
derrière les fagots...
Tiens-nous au courant si tu en trouves (passe devant on a le courage de te
suivre... ! ;-)

Jacques.

"rodolphe rebeyrotte" a écrit dans le
message de news: 3f8a01c3e40f$81969e40$
Finalement j'ai trouvé la solution à mon problème

Tu peux executer

Update INFORMATION_SCHEMA.COLUMNS
set ORDINAL_POSITION = LeNouveauRang
where TABLE_NAME='ma table'
AND COLUMN_NAME ='ma colonne'

attention il y a un index unique donc il faut être sur que
le rang est libre.

pour ce faire il faut activer l'option "Autoriser les
modifications directes dans les catalogues du système" sur
l'onglet "paramètres du serveur" des propriétés du serveur
Avatar
el.c. - myLittleTools.net
> Tiens-nous au courant si tu en trouves (passe devant on a le courage
de te suivre... ! ;-)



personnellement, je me limite aux SELECT sur les tables systèmes ;-)

el.c.

--
// myLittleTools.net : leading provider of web-based applications.
// myLittleAdmin : online MS SQL manager
// http://www.mylittletools.net
//
Avatar
Fred BROUARD
Extrémement dangereux voir catastrophique.

En effet, cette psoition ordinale est utilisée dans des requêtes du genre :

INSERT INTO LaTable VALUES (Val1, Val2)

ou encore

SELECT * FROM LaTable ... ORDER BY 1

Si de telles requêtes ont été implantées dans le développement alors
elle ne fonctionneront plsu comme attendue.
En particulier pour INSERT (erreur possible) et pour le SELECT dans le
cas d'une imbrication dans un curseur.

Dans l'absolue ne JAMAIS toucher directement aux données système. C'est
le moyen le plus simple pour perdre irrémédiablement une base de données.

De plus l'ordre des colonnes dans une table n'est que "cosmétique"
puisque l'on peut reamnier cet ordre dans toutes les requêtes. Par
exemple préciser la liste des colonnes dans la clause SELECT.

A lire : http://sqlpro.developpez.com/SQL_AZ_E.html#Position

A +

rodolphe rebeyrotte a écrit:
Finalement j'ai trouvé la solution à mon problème

Tu peux executer

Update INFORMATION_SCHEMA.COLUMNS
set ORDINAL_POSITION = LeNouveauRang
where TABLE_NAME='ma table'
AND COLUMN_NAME ='ma colonne'

attention il y a un index unique donc il faut être sur que
le rang est libre.

pour ce faire il faut activer l'option "Autoriser les
modifications directes dans les catalogues du système" sur
l'onglet "paramètres du serveur" des propriétés du serveur



--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************
Avatar
Rodolphe Rebeyrotte
justement si l'ordre d'affichage de tes colonnes est
important et que tu utilises * , l'ordre de tes colonnes
n'a rien de "cosmétique"

-----Message d'origine-----
Extrémement dangereux voir catastrophique.

En effet, cette psoition ordinale est utilisée dans des


requêtes du genre :

INSERT INTO LaTable VALUES (Val1, Val2)

ou encore

SELECT * FROM LaTable ... ORDER BY 1

Si de telles requêtes ont été implantées dans le


développement alors
elle ne fonctionneront plsu comme attendue.
En particulier pour INSERT (erreur possible) et pour le


SELECT dans le
cas d'une imbrication dans un curseur.

Dans l'absolue ne JAMAIS toucher directement aux données


système. C'est
le moyen le plus simple pour perdre irrémédiablement une


base de données.

De plus l'ordre des colonnes dans une table n'est


que "cosmétique"
puisque l'on peut reamnier cet ordre dans toutes les


requêtes. Par
exemple préciser la liste des colonnes dans la clause


SELECT.

A lire :


http://sqlpro.developpez.com/SQL_AZ_E.html#Position

A +

rodolphe rebeyrotte a écrit:
Finalement j'ai trouvé la solution à mon problème

Tu peux executer

Update INFORMATION_SCHEMA.COLUMNS
set ORDINAL_POSITION = LeNouveauRang
where TABLE_NAME='ma table'
AND COLUMN_NAME ='ma colonne'

attention il y a un index unique donc il faut être sur




que
le rang est libre.

pour ce faire il faut activer l'option "Autoriser les
modifications directes dans les catalogues du système"




sur
l'onglet "paramètres du serveur" des propriétés du




serveur

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server /


Delphi / web
Livre SQL - col. Référence :


http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros :


http://sqlpro.developpez.com
****************** mailto:


******************

.



Avatar
Vuillermet Jacques
Je pense pouvoir affirmer qu'à aucun moment la norme SQL 89/92 ne garantit
l'ordre des champs lors d'un "SELECT *".
En conséquence, quand deux "SELECT *" successifs sont demandés ce n'est pas
une erreur si le SGBDR (SQL Server, Oracle, ...) renvoie deux ordres de
champs différents.
Donc, il ne vaut mieux pas "compter dessus" (sur un ordre fixe et
déterminé).

...et pour les mathématiciens, l'ordre des colonnes (en mathématique cela
s'appelle autrement mais j'ai oublié !) dans une relation (c'est-à-dire une
table pour les mathématiciens) n'a pas d'importance.

La réflexion est identique pour l'ordre des enregistrements.

Ceci étant dit, nous avions bien vu dans le post initial : « Je souhaite
faire un migration de base et avoir une structure de base de données
"Propre"! ».
Il m'arrive aussi de faire "propre" juste avant de rendre ma copie au client
en début de recette !

Jacques.

"Rodolphe Rebeyrotte" a écrit dans le
message de news: 4aed01c3e4d8$36b81b50$
justement si l'ordre d'affichage de tes colonnes est
important et que tu utilises * , l'ordre de tes colonnes
n'a rien de "cosmétique"

-----Message d'origine-----
Extrémement dangereux voir catastrophique.

En effet, cette psoition ordinale est utilisée dans des


requêtes du genre :

INSERT INTO LaTable VALUES (Val1, Val2)

ou encore

SELECT * FROM LaTable ... ORDER BY 1

Si de telles requêtes ont été implantées dans le


développement alors
elle ne fonctionneront plsu comme attendue.
En particulier pour INSERT (erreur possible) et pour le


SELECT dans le
cas d'une imbrication dans un curseur.

Dans l'absolue ne JAMAIS toucher directement aux données


système. C'est
le moyen le plus simple pour perdre irrémédiablement une


base de données.

De plus l'ordre des colonnes dans une table n'est


que "cosmétique"
puisque l'on peut reamnier cet ordre dans toutes les


requêtes. Par
exemple préciser la liste des colonnes dans la clause


SELECT.

A lire :


http://sqlpro.developpez.com/SQL_AZ_E.html#Position

A +

rodolphe rebeyrotte a écrit:
Finalement j'ai trouvé la solution à mon problème

Tu peux executer

Update INFORMATION_SCHEMA.COLUMNS
set ORDINAL_POSITION = LeNouveauRang
where TABLE_NAME='ma table'
AND COLUMN_NAME ='ma colonne'

attention il y a un index unique donc il faut être sur




que
le rang est libre.

pour ce faire il faut activer l'option "Autoriser les
modifications directes dans les catalogues du système"




sur
l'onglet "paramètres du serveur" des propriétés du




serveur

--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server /


Delphi / web
Livre SQL - col. Référence :


http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros :


http://sqlpro.developpez.com
****************** mailto:


******************

.



Avatar
Rodolphe Rebeyrotte
Je n'ai pas de problème de select *

mon problème est de migrer une base à l'identique afin de
la comparer à la base de référence automatiquement.

c'est réussi, c'est fiable et je peux migrer à la chaîne.

c'est tout ce dont j'avais besoin, les select * j'en ai
rien à faire : c'était pas la question de départ
Avatar
Rodolphe Rebeyrotte
ça marche il faut juste recréer les relations

au final ça évite quand même l'utilisation d'une table
temporaire et la recopie de données