SQL exclure une colonne à l'aide de SELECT * [sauf la colonneA] DE la tableA?

733

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 des colonnes d'une table sans spécifier toutes les colonnes?

SELECT * [except columnA] FROM tableA

La seule façon que je sache est de spécifier manuellement toutes les colonnes et d'exclure la colonne indésirable. Cela prend vraiment beaucoup de temps, donc je cherche des moyens d'économiser du temps et des efforts à ce sujet, ainsi qu'une maintenance future si la table a plus / moins de colonnes.

pb2q
la source
27
Il serait très pratique d'avoir cette fonctionnalité, non pas pour mettre en code de production, mais à des fins de dépannage. Exemple: J'ai une table qui a plusieurs colonnes que je recherche, mais je veux omettre rapidement une ou deux colonnes de texte.
Micah B.
J'en avais besoin lorsque je travaillais avec openquery (bien que j'aie besoin des fonctionnalités de MySQL plutôt que de SQL Server). J'ai dû interroger une base de données MySQL à l'aide de SQL Server. Parce qu'une table MySQL avait des colonnes de caractères de largeur fixe, je ne pouvais pas utiliser de SELECT *requête (OLE DB a des problèmes pour les mapper). Je n'ai pas pu spécifier les bonnes colonnes car je n'avais pas d'accès direct à la base de données MySQL, mais SQL Server a eu la gentillesse de m'informer des noms des colonnes char à largeur fixe ...
jahu
2
Je voudrais ajouter une autre raison à cela: à l' SELECT DISTINCT *exception de la colonne clé pour fonctionner sans lignes en double que quelqu'un d'autre a créées
undrline
1
Je reconnais que cela prend du temps. C'est pourquoi je fais habituellement juste un clic droit sur le tableau, choisissez "sélectionner les 1000 premières lignes", puis supprimez les colonnes dont je ne veux pas.
ThomasRones
2
à ne pas oublier: dans de nombreux cas, le développeur ne connaît pas les colonnes car elles peuvent changer. cela est typique dans les entrepôts de données. après 6 mois, ils ajoutent une colonne supplémentaire et elle doit être sélectionnée sans changer le code.

Réponses:

447

Je suis d'accord avec tout le monde ... mais si j'allais 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
Norman Skinner
la source
222
Inefficace ... mais très créatif :)
Guillermo Gutiérrez
1
Beau. J'ai souvent besoin d'inclure la jointure de deux tables temporaires ou une température à une autre table où je n'ai pas besoin de toutes les colonnes dans la température - en particulier parce que le regroupement sera impliqué.
VISQL
2
Très agréable. Bien sûr, résout le problème d'abstraction des noms de colonne.
Grille
1
@CeesTimmerman - si vous avez une requête impliquant des noms de colonne en double, c'est un problème distinct, quelle que soit l'approche que vous adoptez. Google "Renommer la colonne SQL" ou "Alias ​​de la colonne SQL". Quelque chose comme SELECT table1.ID AS table1ID ..., IIRC.
ToolmakerSteve
3
@ToolmakerSteve L'idée de cette question est de spécifier uniquement les colonnes dont vous n'avez pas besoin. Pour nommer les colonnes, il faudrait spécifier toutes, disons, plus de 20 colonnes d'une table particulière.
Cees Timmerman
289

Non.

La meilleure pratique en matière de maintenance est de ne spécifier que 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 le Columnsnœud d'une table, il place pour vous une liste CSV de colonnes dans la fenêtre de requête qui atteint l'un de vos objectifs

gbn
la source
3
je n'ai jamais su le truc de faire glisser columsn merci GBN tu as encore sauvé la journée. vous devez faire beaucoup de $$ en raison de votre expertise sql
l --''''''----------------- '' '' '' '' '' ''
4
il existe des scénarios valides avec SELECT *, en particulier dans les routines ETL. Je pense que la meilleure réponse ici est celle avec SQL dynamique.
mishkin
1
Il y a des cas où vous voulez sélectionner, par exemple, toutes les données d'un étudiant pour l'exploration statistique, mais ne pas abattre l'identifiant de l'étudiant lui-même pour renforcer la confidentialité
George Birbilis
3
"spécifier uniquement les colonnes requises" - non-codage en dur
RM Haley
9
Bien que des réponses comme celle-ci obtiennent beaucoup de votes, elles n'ont aucune valeur en ce qui me concerne. Conceptuellement, le fait de pouvoir "Sélectionner * Sauf ABC" n'est pas plus problématique que "Sélectionner *" que la langue prend en charge. Le PO demande clairement un moyen d'accomplir quelque chose. La personne qui répond à cette question n'a aucun moyen de savoir si l'OP veut l'utiliser dans le code de production ou si elle a juste besoin immédiatement d'exécuter une requête comme celle-ci pendant qu'elle développe du code pour la base de données, donc la conférence sur les bonnes normes n'apporte aucune valeur.
Itsme2003
68

Si vous ne voulez pas écrire manuellement le nom de chaque colonne, vous pouvez utiliser Script Table Asen cliquant avec le bouton droit sur la table ou afficher dans SSMS comme ceci:

entrez la description de l'image ici

Ensuite, vous obtiendrez toute la requête de sélection dans la nouvelle fenêtre de l'éditeur de requête, puis supprimez la colonne indésirable comme ceci:

entrez la description de l'image ici

Terminé

hims056
la source
2
C'est plus facile que de sélectionner tous les noms de colonnes puis d'y ajouter des virgules.
shaijut
68

La façon automatisée de le faire dans SQL (SQL Server) est:

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);
pl80
la source
Que faire si vous interrogez à partir du résultat d'un CTE ou d'une autre sous-requête? Un exemple simple: vous souhaiterez peut-être créer une sous-requête qui ajoute le résultat de row_number()à chaque ligne, puis effectuer une jointure par row_number, puis tout sélectionner à l' exceptionrow_number de du résultat du jointure.
ely
43

Vous pouvez créer une vue qui a les colonnes que vous souhaitez sélectionner, puis vous pouvez simplement à select *partir de la vue ...

campo
la source
8
Au début, ma réaction a été "comment est-ce plus facile que de simplement spécifier les colonnes"? Mais j'ai alors décidé que du point de vue de la maintenance, cela pourrait être une amélioration.
ToolmakerSteve
1
Cela prend également en charge l'optimiseur de requêtes plutôt que de le neutraliser avec une table temporaire ou SQL dynamique.
underscore_d
30

Oui c'est possible (mais non 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. Cette valeur par défaut est NULL.
  2. Utilisez une vue système pour déterminer les noms des colonnes de notre tableau.
  3. Utilisez SELECT @variable = @variable + ... FROMpour concaténer les noms de colonne. Ce type de SELECTne renvoie pas de jeu de résultats. Il s'agit peut-être d'un comportement non documenté, mais qui fonctionne dans toutes les versions de SQL Server. Comme alternative, vous pouvez utiliser SET @variable = (SELECT ... FOR XML PATH(''))pour concaténer des chaînes.
  4. Utilisez le ISNULL fonction pour ajouter une virgule uniquement si ce n'est pas le nom de la première colonne. Utilisez la QUOTENAMEfonction pour prendre en charge les espaces et la ponctuation dans les noms de colonne.
  5. Utilisez la WHEREclause pour masquer les colonnes que nous ne voulons pas voir.
  6. Utilisez EXEC (@variable), également appelé SQL dynamique , pour résoudre les noms de colonne lors de l'exécution. Cela est nécessaire car nous ne connaissons pas les noms des colonnes au moment de la compilation.
Anthony Faull
la source
Merci! C'était la clé pour résoudre mon problème .
Antonio
J'ai une question: pour quelle raison la deuxième sélection doit-elle être insérée dans une déclaration EXEC? J'ai vu que c'était effectivement nécessaire, mais je me demande pourquoi je ne peux pas simplement écrireSELECT @columns FROM contact
Antonio
17

Comme les autres l'ont dit, il n'y a aucun moyen de le faire, mais si vous utilisez Sql Server, une astuce 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 souhaitez sans avoir à les saisir toutes.

MrTelly
la source
13
Voir mon conseil sur le glisser-déposer depuis SSMS
gbn
11

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

Si vous regardez l' invite SQL de Red-Gate , vous pouvez taper "SELECT * FROM MyTable", puis déplacer le curseur en arrière après le "*", et appuyer sur <TAB> pour développer la liste des champs et supprimer ces quelques champs que vous pas besoin.

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

Marc

marc_s
la source
C'est bien, mais le problème est que votre requête peut devenir énorme. Ce serait bien d'avoir la fonctionnalité "except", pas pour le code prod, mais pour les requêtes ad hoc.
Micah
8

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

EDIT Peut-être si votre base de données prend en charge l'exécution de sql dynamique u pourrait écrire un SP et passer les colonnes que vous ne voulez pas voir et le laisser créer la requête dynamiquement et vous renvoyer le résultat. Je pense que c'est faisable dans SQL Server atleast

Ali Kazmi
la source
13
C'est faisable mais je licencierais la personne qui fait ça.
Lieven Keersmaekers, le
Problème de nettoyage classique: copiez les données que vous souhaitez conserver dans une table temporaire, tronquez la grande, remplissez à nouveau avec la table temporaire. Vous devez exclure la colonne d'identité.
Volker
8

Si vous utilisez SQL Server Management Studio, procédez comme suit:

  1. Tapez le nom de votre table souhaité et sélectionnez-le
  2. Appuyez sur Alt+F1
  3. o / p affiche les colonnes du tableau.
  4. Sélectionnez les colonnes souhaitées
  5. Copiez et collez ceux dans votre requête de sélection
  6. Déclenchez la requête.

Prendre plaisir.

asdasdasd
la source
7

Dans SQL Management Studio, vous pouvez développer les colonnes dans l'Explorateur d'objets, puis faire glisser l' Columnsélément d'arborescence dans une fenêtre de requête pour obtenir une liste de colonnes séparées par des virgules.

cjk
la source
6

En résumé, vous ne pouvez pas le faire, mais je ne suis pas d'accord avec tous les commentaires ci-dessus, il existe des scénarios dans lesquels 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 paging) pourquoi diable voudrait spécifier chaque colonne sur l'instruction select externe quand vous l'avez fait dans l'interne?

Shrage Smilowitz
la source
Pouvez-vous utiliser une variante de "innername. *" Pour représenter les colonnes internes, similaire à "SELECT table1. * ..." lors d'une jointure?
ToolmakerSteve
6
DECLARE @SQL VARCHAR(max), @TableName sysname = 'YourTableName'

SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
FROM sys.columns
WHERE OBJECT_ID = OBJECT_ID(@TableName)
AND name NOT IN ('Not This', 'Or that');

SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + @TableName

EXEC (@SQL)

MISE À JOUR:

Vous pouvez également créer une procédure stockée pour effectuer cette tâche si vous l'utilisez plus souvent. Dans cet exemple, j'ai utilisé le STRING_SPLIT () intégré qui est disponible sur SQL Server 2016+, mais si vous en avez besoin, il existe de nombreux exemples de la façon de le créer manuellement sur SO.

CREATE PROCEDURE [usp_select_without]
@schema_name sysname = N'dbo',
@table_name sysname,
@list_of_columns_excluded nvarchar(max),
@separator nchar(1) = N','
AS
BEGIN
 DECLARE 
 @SQL nvarchar(max),
 @full_table_name nvarchar(max) = CONCAT(@schema_name, N'.', @table_name);

 SELECT @SQL = COALESCE(@SQL + ', ', '') + QUOTENAME([Name])
 FROM sys.columns sc
 LEFT JOIN STRING_SPLIT(@list_of_columns_excluded, @separator) ss ON sc.[name] = ss.[value]
 WHERE sc.OBJECT_ID = OBJECT_ID(@full_table_name, N'u')
 AND ss.[value] IS NULL;

 SELECT @SQL = N'SELECT ' + @SQL + N' FROM ' + @full_table_name;
 EXEC(@SQL)
END

Et puis juste:

EXEC [usp_select_without] 
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';
Bartosz X
la source
5

Si nous parlons de procédures, cela fonctionne avec cette astuce pour générer une nouvelle requête et EXÉCUTER IMMÉDIATEMENT :

SELECT LISTAGG((column_name), ', ') WITHIN GROUP (ORDER BY column_id)
INTO var_list_of_columns
FROM ALL_TAB_COLUMNS
WHERE table_name = 'PUT_HERE_YOUR_TABLE'
AND column_name NOT IN ('dont_want_this_column','neither_this_one','etc_column');
AlexandreWL
la source
5

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

Utiliser SQL déclaratif de la manière habituelle, non.

Je pense que la syntaxe que vous proposez est digne et bonne. En fait, le langage de base de données relationnelle «Tutorial D» a une syntaxe très similaire où les mots ALL BUT- clés sont suivis d'un ensemble d'attributs (colonnes).

Cependant, SQL SELECT *reçoit déjà beaucoup de critiques (la réponse de @ Guffa ici est une objection typique), donc je ne pense pas que j'entrerai SELECT ALL BUTbientôt dans la norme SQL.

Je pense que le meilleur «contourner» est de créer un VIEWavec uniquement les colonnes que vous désirez alors SELECT * FROM ThatView.

un jour
la source
1
@underscore_d: J'ai maintenant révisé ma réponse.
onedaywhen
Cool, je suis d'accord avec vos 2 derniers paragraphes. Les informations sur le didacticiel D sont intéressantes, même si j'ai tendance à être d'accord avec ceux qui pensent que select *c'est discutable - très utile pour les trucs et programmes ad hoc qui ont besoin de gérer de manière générique les tableaux de données, mais pas tant pour la construction (en l'absence d'un meilleur mot) requêtes «pures». Pourtant, ne pas être dans la norme ANSI ne signifie pas que Microsoft ne peut pas l'ajouter à leur dialecte, comme pour beaucoup d'autres choses, mais je suis sceptique quant à leur choix.
underscore_d
5

Un dialecte SQL moderne comme BigQuery propose une excellente solution

SELECT * EXCEPT (ColumnNameX, [ColumnNameY, ...])

Il s'agit d'une syntaxe SQL très puissante pour éviter une longue liste de colonnes qui doivent être mises à jour tout le temps en raison des changements de nom de colonne de table. Et cette fonctionnalité manque dans l'implémentation actuelle de SQL Server, ce qui est dommage. Espérons qu'un jour, Microsoft Azure sera plus convivial pour les scientifiques des données.

Les scientifiques des données aiment pouvoir avoir une option rapide pour raccourcir une requête et pouvoir supprimer certaines colonnes (en raison de la duplication ou pour toute autre raison).

https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-modifiers

Velizar VESSELINOV
la source
4

Postgres sql a un moyen de le faire

les pls se réfèrent: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

Le schéma d'information Hack Way

SELECT 'SELECT ' || array_to_string(ARRAY(SELECT 'o' || '.' || c.column_name
        FROM information_schema.columns As c
            WHERE table_name = 'officepark' 
            AND  c.column_name NOT IN('officeparkid', 'contractor')
    ), ',') || ' FROM officepark As o' As sqlstmt

Ce qui précède pour mon exemple de tableau particulier - génère une instruction sql qui ressemble à ceci

SELECT o.officepark, o.owner, o.squarefootage FROM officepark As o

user3393089
la source
Bien que cela puisse théoriquement répondre à la question, il serait préférable d'inclure ici les parties essentielles de la réponse et de fournir le lien de référence.
Bhargav Rao
3

Je ne connais aucune base de données qui supporte cela (SQL Server, MySQL, Oracle, PostgreSQL). Il ne fait définitivement pas partie des normes SQL, donc je pense que vous devez spécifier uniquement les colonnes que vous souhaitez.

Vous pouvez bien sûr créer dynamiquement votre instruction SQL et demander au serveur de l'exécuter. Mais cela ouvre la possibilité d'une injection SQL ..

Ronald Wildenberg
la source
3

Je sais que c'est un peu vieux, mais je venais de rencontrer le même problème et je cherchais une réponse. Ensuite, un développeur senior m'a montré une astuce très simple.

Si vous utilisez l'éditeur de requêtes de Management Studio, développez la base de données, puis développez la table dans laquelle vous sélectionnez afin de voir le dossier des colonnes.

Dans votre instruction select, sélectionnez simplement le dossier des colonnes référencées ci-dessus et faites-le glisser dans la fenêtre de requête. Il collera toutes les colonnes du tableau, puis supprimera simplement la colonne d'identité de la liste des colonnes ...

anonyme
la source
1
Oui, mais si vous avez 5 jointures, l'idée serait de le faireSELECT * Except(tableName.ColumnName) FROM ...
Pawel Cioch
Je trouve cela utile :) Je ne le savais pas, néanmoins ce n'est pas une réponse à la question du sujet.
Fka
3

La meilleure façon de résoudre ce problème est d'utiliser la vue, vous pouvez créer une vue avec les colonnes requises et récupérer les données sous forme

example

mysql> SELECT * FROM calls;
+----+------------+---------+
| id | date       | user_id |
+----+------------+---------+
|  1 | 2016-06-22 |       1 |
|  2 | 2016-06-22 |    NULL |
|  3 | 2016-06-22 |    NULL |
|  4 | 2016-06-23 |       2 |
|  5 | 2016-06-23 |       1 |
|  6 | 2016-06-23 |       1 |
|  7 | 2016-06-23 |    NULL |
+----+------------+---------+
7 rows in set (0.06 sec)

mysql> CREATE VIEW C_VIEW AS
    ->     SELECT id,date from calls;
Query OK, 0 rows affected (0.20 sec)

mysql> select * from C_VIEW;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2016-06-22 |
|  2 | 2016-06-22 |
|  3 | 2016-06-22 |
|  4 | 2016-06-23 |
|  5 | 2016-06-23 |
|  6 | 2016-06-23 |
|  7 | 2016-06-23 |
+----+------------+
7 rows in set (0.00 sec)
Mahesh Madushanka
la source
3
Que faire si le nombre de colonnes est important, disons 100 et que nous voulions sélectionner toutes les colonnes, sauf une. Est-ce qu'il y a une meilleure approche?
KartikKannapur
5
Celui-ci passe à côté de l'essentiel. Vous sélectionnez "id, date" dans le deuxième appel, qui, si vous deviez le faire, faites-le en premier lieu.
keithpjolley
3

Si vous souhaitez exclure une colonne de cas sensible comme le mot de passe par exemple, je fais cela pour masquer la valeur:

SELECT * , "" as password FROM tableName;

Lu Blue
la source
celui-ci a fonctionné pour moi
Arun Prasad ES
1
Bien que vous ne deviez bien sûr jamais stocker de mots de passe en texte clair dans votre base de données. Au moins, ils devraient être hachés avec du sel et peut-être du poivre security.stackexchange.com/questions/3272/…
Anders_K
2

Eh bien, il est recommandé de spécifier les colonnes que vous souhaitez au lieu de simplement spécifier *. Vous devez donc simplement indiquer les champs que vous souhaitez que votre sélection renvoie.

Gustavo
la source
2

Un collègue a conseillé une bonne alternative:

  • Sélectionnez SELECT INTO dans votre requête précédente (où vous générez ou récupérez les données) dans une table (que vous supprimerez une fois terminé). Cela créera la structure pour vous.
  • Faites un script comme CRÉER dans une nouvelle fenêtre de requête.
  • Supprimez les colonnes indésirables. Formatez les colonnes restantes dans une ligne 1 et collez-les comme liste de colonnes.
  • Supprimez le tableau que vous avez créé.

Terminé...

Cela nous a beaucoup aidés.

Charl
la source
1

Cliquez avec le bouton droit sur la table dans l'Explorateur d'objets, sélectionnez les 1000 premières lignes

Il listera toutes les colonnes et non *. Supprimez ensuite la ou les colonnes indésirables. Cela devrait être beaucoup plus rapide que de le taper vous-même.

Ensuite, lorsque vous sentez que c'est un peu trop de travail, obtenez l'invite SQL de Red Gate et tapez ssf à partir de tbl, accédez à * et cliquez à nouveau sur l'onglet.

cairnz
la source
1

C'est ce que j'utilise souvent pour ce cas:

declare @colnames varchar(max)=''

select @colnames=@colnames+','+name from syscolumns where object_id(tablename)=id and name not in (column3,column4)

SET @colnames=RIGHT(@colnames,LEN(@colnames)-1)

@colnames ressemble à column1,column2,column5

Valeriy
la source
1

Parfois, le même programme doit gérer différentes structures de base de données. Je n'ai donc pas pu utiliser une liste de colonnes dans le programme pour éviter les erreurs dans les selectinstructions.

*me donne tous les champs facultatifs. Je vérifie si les champs existent dans la table de données avant utilisation. Ceci est ma raison d'utiliser *en select.

Voici comment je gère les champs exclus:

Dim da As New SqlDataAdapter("select * from table", cn)
da.FillSchema(dt, SchemaType.Source)
Dim fieldlist As String = ""
For Each DC As DataColumn In DT.Columns
   If DC.ColumnName.ToLower <> excludefield Then
    fieldlist = fieldlist &  DC.Columnname & ","
   End If
  Next
Dusan
la source
Pensez à élaborer / clarifier votre question / problème.
badfilms
1

Je sais que cette question est ancienne, mais j'espère que cela peut toujours être utile.La réponse est inspirée d'une discussion sur les forums SQL Server . Vous pouvez en faire une procédure stockée . Il peut également être modifié pour ajouter plusieurs champs à l'exception de.

DECLARE @SQL NVARCHAR(MAX)
SELECT @SQL = COALESCE(@SQL + ', ', ' ' ) + name from sys.columns where name not in ('colName1','colName2') and object_id = (Select id from sysobjects where name = 'tblName')
SELECT @SQL = 'SELECT ' + @SQL + ' FROM ' + 'tblName'
EXEC sp_executesql  @SQL
Weihui Guo
la source
0

Ne serait-ce pas plus simple de faire ça:

sp_help <table_name>

-Cliquez sur la colonne 'Column_name'> Copier> Coller (crée une liste verticale) dans une nouvelle fenêtre de requête et tapez simplement des virgules devant chaque valeur de colonne ... commentez les colonnes que vous ne voulez pas ... beaucoup moins en tapant que tout code proposé ici et toujours gérable.

OLP
la source
"beaucoup moins de frappe que n'importe quel code proposé ici" et beaucoup plus de tracas que de faire glisser le nœud Colonnes dans l'éditeur de requête ou l'une des autres façons supérieures d'obtenir la liste. Je veux dire, qu'en est-il des tables avec plusieurs dizaines de colonnes?
underscore_d
0

Vous pouvez obtenir SQL Complete sur devart.com, qui étend non seulement le caractère générique * comme le fait SQL Prompt de Red Gate (comme décrit dans la réponse de cairnz), mais fournit également un sélecteur de colonne déroulant avec des cases à cocher dans lesquelles vous pouvez cocher toutes les colonnes que vous souhaitez dans la liste de sélection et elles seront insérées automatiquement pour vous (et si vous décochez ensuite une colonne, elle sera automatiquement supprimée de la liste de sélection).

yoel halb
la source
0

Dans SSMS, il existe un moyen plus simple avec IntelliSense et l' alias . Essaye ça

  1. Cliquez avec le bouton droit dans l'éditeur de texte et assurez-vous que IntelliSense est activé.
  2. Tapez la requête avec un alias [SELECT t. * FROM tablename t].
  3. Allez dans le texte t. * Et supprimez le * , et SSMS listera automatiquement les colonnes du f tableau aliasé.
Vous pouvez ensuite spécifier rapidement uniquement les colonnes que vous souhaitez sans avoir à utiliser SSMS pour écrire une sélection dans un autre script, puis effectuer d'autres opérations de copier / coller. Je l'utilise tout le temps.

Michael Barash
la source
Pourriez-vous spécifier votre réponse à l'exclusion de colonne, s'il vous plaît?
Kamiccolo
@Kamiccolo - ce qui est décrit par DuckWork est une action MANUELLE. Couper et coller les noms de colonnes souhaités. Il dit simplement que c'est un moyen d'obtenir plus facilement les noms, sans trop taper. Cela ne vous aide pas à écrire une requête qui dit "exclure cette colonne". Il vous aide simplement à créer la liste de colonnes souhaitée, que vous collez ensuite dans votre requête.
ToolmakerSteve