1153 Stimmen

Eine Spalte ausschließen mit SELECT * [except columnA] FROM tableA?

Wir alle wissen, dass wir alle Spalten einer Tabelle auswählen können, wenn wir

SELECT * FROM tableA

Gibt es eine Möglichkeit, Spalten aus einer Tabelle auszuschließen, ohne dass alle Spalten angegeben werden müssen?

SELECT * [except columnA] FROM tableA

Die einzige Möglichkeit, die ich kenne, besteht darin, alle Spalten manuell anzugeben und die unerwünschte Spalte auszuschließen. Das ist sehr zeitaufwändig, daher suche ich nach Möglichkeiten, Zeit und Mühe zu sparen, und auch für die künftige Wartung, wenn die Tabelle mehr oder weniger Spalten hat.

59 Stimmen

Es wäre sehr praktisch, diese Funktion zu haben, nicht um sie in den Produktionscode einzubauen, sondern für die Fehlersuche. Beispiel: Ich habe eine Tabelle mit mehreren Spalten, die ich abfrage, aber ich möchte schnell eine oder zwei Textspalten auslassen.

0 Stimmen

Ich brauchte dies, als ich mit openquery arbeitete (obwohl ich die Funktionalität in MySQL und nicht in SQL Server benötigte). Ich musste eine MySQL-Datenbank mit SQL Server abfragen. Da eine MySQL-Tabelle Char-Spalten mit fester Breite hatte, konnte ich keine SELECT * Abfrage (OLE DB hat Probleme, diese zuzuordnen). Ich konnte die richtigen Spalten nicht angeben, da ich keinen direkten Zugriff auf die MySQL-Datenbank hatte, aber SQL Server war so freundlich, mir die Namen der Char-Spalten mit fester Breite mitzuteilen...

9 Stimmen

Ich möchte noch einen weiteren Grund hinzufügen, dies zu tun: SELECT DISTINCT * außer für die Schlüsselspalte, damit sie ohne doppelte Zeilen funktioniert, die jemand anderes erstellt hat

10voto

Bartosz X Punkte 2402
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)

UPDATE :

Sie können auch eine gespeicherte Prozedur erstellen, um diese Aufgabe zu erledigen, wenn Sie sie häufiger verwenden. In diesem Beispiel habe ich die eingebaute STRING_SPLIT() die auf SQL Server 2016+ verfügbar ist, aber wenn Sie es brauchen, gibt es viele Beispiele, wie man es manuell auf SO erstellen kann.

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

Und dann einfach:

EXEC [usp_select_without] 
@table_name = N'Test_Table',
@list_of_columns_excluded = N'ID, Date, Name';

9voto

asdasdasd Punkte 89

Wenn Sie SQL Server Management Studio verwenden, gehen Sie wie folgt vor:

  1. Geben Sie den gewünschten Tabellennamen ein und wählen Sie ihn aus.
  2. Presse Alt + F1
  3. o/p zeigt die Spalten in der Tabelle an.
  4. Wählen Sie die gewünschten Spalten aus
  5. Kopieren Sie diese und fügen Sie sie in Ihre Abfrage ein.
  6. Starten Sie die Abfrage.

Viel Spaß!

9voto

Ali Kazmi Punkte 3532

Nein, es gibt keine Möglichkeit, dies zu tun. Vielleicht können Sie benutzerdefinierte Ansichten erstellen, wenn das in Ihrer Situation machbar ist

EDIT Wenn Ihre DB die Ausführung von dynamischem Sql unterstützt, könnten Sie vielleicht eine SP schreiben und die Spalten, die Sie nicht sehen wollen, an sie weitergeben. Ich denke, dies ist zumindest in SQL Server machbar.

9voto

user3393089 Punkte 129

Postgres sql hat eine Möglichkeit, dies zu tun

bitte nachschlagen: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

Der Weg zum Informationsschema-Hack

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

Das obige Beispiel für meine spezielle Tabelle erzeugt eine SQL-Anweisung, die wie folgt aussieht

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

9voto

Stephen Kaiser Punkte 71

Eigentlich Schneeflocke gerade veröffentlicht exclude also würden Sie jetzt einfach:

SELECT * EXCLUDE [columnA,columnB,...] FROM tableA

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X