Puis-je réorganiser logiquement les colonnes d'une table?

93

Si j'ajoute une colonne à une table dans Microsoft SQL Server, puis-je contrôler où la colonne est affichée logiquement dans les requêtes?

Je ne veux pas gâcher la disposition physique des colonnes sur le disque, mais je voudrais regrouper les colonnes de manière logique lorsque cela est possible afin que des outils tels que SQL Server Management Studio répertorient le contenu de la table de manière pratique.

Je sais que je peux le faire via SQL Management Studio en entrant dans leur mode «conception» pour les tables et en faisant glisser l'ordre des colonnes, mais j'aimerais pouvoir le faire en SQL brut afin de pouvoir effectuer la commande scripté à partir de la ligne de commande.

appel rapide
la source
Trop tard pour une réponse mais jetez un œil à ce lien. blog.sqlauthority.com/2013/03/11/…
sqluser
et une autre question connexe, à savoir si cela compte stackoverflow.com/questions/6692021/…
Tim Abell
Microsoft connect: syntaxe ALTER TABLE pour changer l'ordre des colonnes - la réponse est de la variété de la théière au chocolat comme d'habitude WONTFIX
Tim Abell

Réponses:

77

Vous ne pouvez pas effectuer cette opération par programme (de manière sûre) sans créer une nouvelle table.

Ce que fait Enterprise Manager lorsque vous validez une réorganisation est de créer une nouvelle table, de déplacer les données, puis de supprimer l'ancienne table et de renommer la nouvelle table avec le nom existant.

Si vous voulez que vos colonnes soient dans un ordre / groupement particulier sans modifier leur ordre physique, vous pouvez créer une vue qui peut être celle que vous désirez.

vzczc
la source
43

Je pense que ce que tout le monde manque ici, c'est que même si tout le monde n'a pas à gérer des instances de 10, 20 ou 1000 du même système logiciel installé dans tout le pays et dans le monde ... ceux d'entre nous qui concevons des logiciels vendus dans le commerce le font. En conséquence, nous étendons les systèmes au fil du temps, développons les tables en ajoutant des champs au fur et à mesure que de nouvelles capacités sont nécessaires, et à mesure que ces champs sont identifiés, ils appartiennent à une table existante, et en tant que tels, plus d'une décennie d'expansion, de croissance, d'ajout de champs, etc. aux tables .... et ensuite avoir à travailler avec ces tables de la conception à la prise en charge, en passant parfois par les données brutes / le dépannage pour déboguer de nouveaux bogues de fonctionnalité .... il est incroyablement aggravant de ne pas avoir les informations principales que vous souhaitez voir dans la première poignée de champs,

J'ai souvent souhaité pouvoir le faire, pour cette raison exacte. Mais à moins de faire exactement ce que fait SQL, créer un script de création pour une nouvelle table comme je le souhaite, y écrire l'insertion, puis supprimer toutes les contraintes, relations, clés, index, etc., etc., de la table existante et renommer la "nouvelle" table de retour à l'ancien nom, puis la lecture de toutes ces clés, relations, index, etc etc ....

N'est pas seulement fastidieux, prend du temps, mais ... dans cinq ans, cela devra se reproduire ...

Cela vaut tellement la peine que cette quantité de travail énorme, mais le fait est que ... ce ne sera pas la dernière fois que nous aurons besoin de cette capacité, car nos systèmes continueront de croître, de s'étendre et d'obtenir des champs dans un ordre délirant conduit par besoins / ajouts de conception.

Une majorité de développeurs pensent d'un point de vue système unique qui sert une seule entreprise ou un marché très spécifique de la boîte rigide.

Les concepteurs et les leaders du développement «standard» mais significativement progressistes dans leur espace de marché devront toujours faire face à ce problème, encore et encore ..... aimeraient une solution créative si quelqu'un en a une. Cela pourrait facilement faire gagner à mon entreprise une douzaine d'heures par semaine, sans avoir à faire défiler la page ou à se souvenir où "ce" champ se trouve dans la table de données source ...

Philip Coyner
la source
Nous avons eu le même problème et avons créé une procédure stockée qui automatise ce processus (renommer, créer une nouvelle table, copier, recréer toutes les clés étrangères, les contraintes, etc.). Il vous suffit de passer le nom de la table et le nouvel ordre des colonnes. Si cela pouvait réellement faire gagner à votre entreprise des dizaines d'heures par semaine, vous devriez investir le temps d'écrire un script similaire. Pour nous, il n'a fallu qu'environ 2-3 jours pour avoir un script stable que nous utilisons régulièrement pour réorganiser les colonnes. Il prend en charge toutes les fonctionnalités que nous utilisons dans SqlServer (par exemple, les index partiels, les vues indexées, etc.) et ne comprend qu'environ 400 LOC.
Andreas
Je ne sais pas pourquoi ils ne peuvent pas abstraction de la disposition des colonnes d'une manière ou d'une autre. Il n'est pas nécessaire de réorganiser physiquement les colonnes! La quantité de niveau PHD et au-delà de l'ingénierie dans Sql Server est vraiment étonnante. Lorsque vous considérez la complexité de la génération du plan de requête, les statistiques, l'indexation et personne ne s'est encore levé et a dit «Faisons simplement une table qui représente l'ordre LOGIQUE. FieldID Guid, OrderBy int. Terminé. Puis SSMS ou SELECT *utilise ça. Désactivez-le si vous êtes un DBA parfait et que vous n'en voulez pas. Très frustrant. Et maintenant, mes tables sont assez grandes pour que je ne puisse plus les forcer brutalement.
Simon_Weaver
Je sais que c'est un ancien commentaire, mais Visual Studio dans le projet de base de données crée automatiquement un script SQL pour la réorganisation des colonnes physiques lorsque vous modifiez le schéma de la table et appuyez sur Publier.
Muflix
5

Si je comprends votre question, vous souhaitez affecter les colonnes renvoyées en premier, deuxième, troisième, etc. dans les requêtes existantes , n'est-ce pas?

Si toutes vos requêtes sont écrites avec SELECT * FROM TABLE- alors elles apparaîtront dans la sortie telles qu'elles sont présentées dans SQL.

Si vos requêtes sont écrites avec SELECT Field1, Field2 FROM TABLE- l'ordre dans lequel elles sont disposées en SQL n'a pas d'importance.

Otto
la source
3

Lorsque Management Studio le fait, il crée une table temporaire, copie tout le contenu, supprime votre table d'origine et renomme la table temporaire. Il n'y a pas d'instruction T-SQL équivalente simple.

Si vous n'avez pas envie de faire cela, vous pouvez toujours créer une vue de la table avec les colonnes dans l'ordre que vous souhaitez et l'utiliser?

Edit: battu!

tags2k
la source
1

Il existe un moyen, mais ce n'est que temporairement pour la requête elle-même. Par exemple,

Disons que vous avez 5 tables. La table s'appelleT_Testing

FirstName, LastName, PhoneNumber, Email et Member_ID

vous voulez qu'il répertorie leur identifiant, puis leur nom, puis leur prénom, leur téléphone et leur adresse e-mail.

Vous pouvez le faire selon le Select.

Select Member_ID, LastName, FirstName, PhoneNumber, Email
From T_Testing

En dehors de cela, si vous voulez simplement que le nom de famille s'affiche avant le prénom pour une raison quelconque, vous pouvez le faire également comme suit:

Select LastName, *
From T_Testing

La seule chose que vous voulez être sûr de faire est que la fonction OrderBy ou Where doit être désignée comme Table.Column si vous allez utiliser un Where ou OrderBy

Exemple:

Select LastName, *
From T_Testing
Order By T_Testing.LastName Desc

J'espère que cela aide, je l'ai compris parce que je devais le faire moi-même.

Steven
la source
Dans cette requête Sélectionnez LastName, * De T_Testing, vous obtenez LastName deux fois.
sqluser
1
  1. Script votre table existante dans une fenêtre de requête.
  2. Exécutez ce script sur une base de données Test (supprimez l'instruction Use)
  3. Utilisez SSMS pour apporter les modifications de colonne dont vous avez besoin
  4. Cliquez sur Générer un script de modification (icône la plus à gauche et la plus basse de la barre de boutons, par défaut)
  5. Utilisez ce script contre votre vraie table

Le script ne fait vraiment que créer une deuxième table de table avec les ordres de colonnes souhaités, y copie toutes vos données, supprime la table d'origine, puis renomme la table secondaire pour la remplacer. Cela vous évite de l'écrire vous-même si vous souhaitez un script de déploiement.

Paul
la source
0

Il n'est pas possible de modifier l'ordre des colonnes sans recréer la table entière. Si vous ne disposez que de quelques instances de la base de données, vous pouvez utiliser SSMS pour cela (sélectionnez la table et cliquez sur «concevoir»).

Au cas où vous auriez trop d'instances pour un processus manuel, vous devriez essayer ce script: https://github.com/Epaminaidos/reorder-columns

Andreas
la source