Question SQL exclut une colonne en utilisant SELECT * [sauf columnA] FROM tableA?


Nous savons tous que pour sélectionner toutes les colonnes d'une table, nous pouvons utiliser

SELECT * FROM tableA

Existe-t-il un moyen d'exclure les colonnes d'une table sans spécifier toutes les colonnes?

SELECT * [except columnA] FROM tableA

La seule façon que je sais est de spécifier manuellement toutes les colonnes et d'exclure la colonne non désirée. Cela prend beaucoup de temps, donc je cherche des façons de gagner du temps et de l'énergie, ainsi que de la maintenance future si la table a plus ou moins de colonnes.

Merci!


527
2018-04-08 09:15


origine


Réponses:


Je suis d'accord avec tout le monde ... mais si je devais faire quelque chose comme ça, je pourrais le faire de cette façon:

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the columns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

349
2017-11-11 00:35



Non.

La meilleure pratique de maintenance consiste à spécifier uniquement les colonnes requises.

Au moins 2 raisons:

  • Cela rend votre contrat entre le client et la base de données stable. Mêmes données, à chaque fois
  • Performance, couvrant les indices

Edit (juillet 2011):

Si vous faites glisser depuis l'Explorateur d'objets, Columns nœud pour une table, il met une liste CSV de colonnes dans la fenêtre de requête pour vous qui atteint l'un de vos objectifs


248
2018-04-08 09:19



La manière automatisée de le faire en SQL (SQL Server) est la suivante:

declare @cols varchar(max), @query varchar(max);
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']';

SELECT @query = 'select ' + @cols + ' from MyTable';  
EXEC (@query);

59
2017-07-14 10:19



Si vous ne voulez pas écrire manuellement chaque nom de colonne, vous pouvez utiliser Script Table As par un clic droit sur table ou vue dans SSMS comme ça:

enter image description here

Ensuite, vous obtiendrez toute requête de sélection dans Nouvelle fenêtre de l'éditeur de requête puis supprimez la colonne non désirée comme ceci:

enter image description here

Terminé


44
2017-07-13 07:03



Vous pouvez créer une vue contenant les colonnes que vous souhaitez sélectionner, puis vous pouvez simplement sélectionner * dans la vue ...


32
2018-04-08 09:33



Oui c'est possible (mais pas recommandé).

CREATE TABLE contact (contactid int, name varchar(100), dob datetime)
INSERT INTO contact SELECT 1, 'Joe', '1974-01-01'

DECLARE @columns varchar(8000)

SELECT @columns = ISNULL(@columns + ', ','') + QUOTENAME(column_name)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'contact' AND COLUMN_NAME <> 'dob'
ORDER BY ORDINAL_POSITION

EXEC ('SELECT ' + @columns + ' FROM contact')

Explication du code:

  1. Déclarez une variable pour stocker une liste de noms de colonnes séparés par des virgules. Cela vaut par défaut NULL.
  2. Utilisez une vue système pour déterminer les noms des colonnes de notre table.
  3. Utilisation SELECT @variable = @variable + ... FROM pour concaténer le noms de colonne. Ce type de SELECT ne renvoie pas un jeu de résultats. C'est peut-être un comportement non documenté mais fonctionne dans toutes les versions de SQL Server. Comme alternative, vous pouvez utiliser SET @variable = (SELECT ... FOR XML PATH('')) concaténer les chaînes.
  4. Utilisez le ISNULL fonction de préfixer une virgule seulement si ce n'est pas le nom de la première colonne. Utilisez le QUOTENAME fonction pour soutenir les espaces et la ponctuation dans les noms de colonnes.
  5. Utilisez le WHERE clause pour masquer les colonnes que nous ne voulons pas voir.
  6. Utilisation EXEC (@variable), aussi connu sous le nom SQL dynamique, pour résoudre le noms de colonne à l'exécution. Ceci est nécessaire car nous ne connaissons pas les noms des colonnes au moment de la compilation.

22
2018-04-13 09:58



Comme les autres l'ont dit, il n'y a aucun moyen de le faire, mais si vous utilisez Sql Server, un truc que j'utilise est de changer la sortie en virgule séparée, alors faites

select top 1 * from table

et couper toute la liste des colonnes de la fenêtre de sortie. Ensuite, vous pouvez choisir les colonnes que vous voulez sans avoir à toutes les taper.


18
2018-04-08 09:21



Fondamentalement, vous ne pouvez pas faire ce que vous voulez - mais vous pouvez obtenir les bons outils pour vous aider à rendre les choses un peu plus faciles.

Si vous regardez Red-Gate Invite SQL, vous pouvez taper "SELECT * FROM MyTable", puis déplacer le curseur après le "*", et appuyer sur <TAB> pour développer la liste des champs, et supprimer les quelques champs dont vous n'avez pas besoin.

Ce n'est pas une solution parfaite - mais une sacrée bonne! :-) Dommage que l'Intellisense de MS SQL Server Management Studio ne soit pas encore assez intelligente pour offrir cette fonctionnalité .......

Marc


11
2018-04-08 12:37



Non, il n'y a aucun moyen de le faire. peut-être que vous pouvez créer des vues personnalisées si c'est faisable dans votre situation

MODIFIER Peut-être que si votre DB supporte l'exécution de sql dynamique, vous pouvez écrire un SP et passer les colonnes que vous ne voulez pas voir et laisser créer la requête dynamiquement et renvoyer le résultat à vous. Je pense que c'est faisable dans SQL Server atleast


8
2018-04-08 09:19



En résumé, vous ne pouvez pas le faire, mais je ne suis pas d'accord avec tous les commentaires ci-dessus, il y a des «scénarios» où vous pouvez légitimement utiliser un * Lorsque vous créez une requête imbriquée afin de sélectionner une plage spécifique dans une liste entière (telle que la pagination) pourquoi dans le monde voudrait spécifier chaque colonne sur l'instruction select externe lorsque vous l'avez fait dans l'intérieur?


7
2018-05-06 19:03