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';
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 hat4 Stimmen
Ich stimme zu, dass es zeitaufwendig ist. Deshalb klicke ich in der Regel einfach mit der rechten Maustaste auf die Tabelle, wähle "oberste 1000 Zeilen auswählen" und entferne dann die Spalten, die ich nicht haben möchte.
8 Stimmen
Nicht zu vergessen: in vielen fällen kennt der entwickler die spalten nicht, weil sie sich ändern können. das ist typisch für data warehouses. nach 6 monaten wird eine zusätzliche spalte hinzugefügt und diese sollte ausgewählt werden, ohne den code zu ändern.
4 Stimmen
Es gibt so viele Anwendungsfälle für eine solche Funktion (n Spalten von einem SELECT * ausschließen, im Gegensatz zu 1 Spalte), dass sie wirklich in den ANSI-Standard für SQL aufgenommen werden sollte.
0 Stimmen
Dies ist der beste Necropost auf dem Server.
0 Stimmen
Ein sehr guter Vorschlag. Es ist mühsam, wenn man die Namen aller Spalten eingeben muss, nur um eine auszuschließen.