SQL wyklucza kolumnę używając SELECT * [oprócz kolumny A] z tabeli A?


733

Wszyscy wiemy, że do wybrania wszystkich kolumn z tabeli możemy użyć

SELECT * FROM tableA

Czy istnieje sposób na wykluczenie kolumn z tabeli bez określenia wszystkich kolumn?

SELECT * [except columnA] FROM tableA

Jedyny znany mi sposób to ręczne określenie wszystkich kolumn i wykluczenie niechcianej kolumny. Jest to naprawdę czasochłonne, dlatego szukam sposobów na zaoszczędzenie czasu i wysiłku, a także przyszłej konserwacji, jeśli tabela ma więcej / mniej kolumn.


27
Byłoby bardzo wygodne mieć tę funkcję, nie wprowadzać kodu produkcyjnego, ale do celów rozwiązywania problemów. Przykład: Mam tabelę, która zawiera kilka kolumn, o które pytam, ale chcę szybko pominąć jedną lub dwie kolumny tekstowe.
Micheasz B.

Potrzebowałem tego podczas pracy z openquery (chociaż potrzebowałem funkcjonalności w MySQL zamiast w SQL Server). Musiałem wysłać zapytanie do bazy danych MySQL przy użyciu programu SQL Server. Ponieważ tabela MySQL ma kolumny char o stałej szerokości, nie mogłem użyć SELECT *zapytania (OLE DB ma problemy z mapowaniem). Nie mogłem określić właściwych kolumn, ponieważ nie miałem bezpośredniego dostępu do bazy danych MySQL, jednak SQL Server był na tyle uprzejmy, aby poinformować mnie o nazwach kolumn char o stałej szerokości ...
jahu

2
Chciałbym dodać kolejny powód, aby to zrobić: SELECT DISTINCT *z wyjątkiem kolumny klucza działającej bez zduplikowanych wierszy utworzonych przez kogoś innego
undrline

1
Zgadzam się, że jest to czasochłonne. Dlatego zwykle po prostu klikam prawym przyciskiem myszy tabelę, wybieram „wybierz górne 1000 wierszy”, a następnie usuwam kolumny, których nie chcę.
ThomasRones,

2
nie zapomnij: w wielu przypadkach programista nie zna kolumn, ponieważ mogą one ulec zmianie. jest to typowe w hurtowniach danych. po 6 miesiącach dodają dodatkową kolumnę i należy ją wybrać bez zmiany kodu.

Odpowiedzi:


446

Zgadzam się ze wszystkimi ... ale jeśli miałbym zrobić coś takiego, mógłbym to zrobić w ten sposób:

/* 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

222
Nieefektywny ... ale bardzo kreatywny :)
Guillermo Gutiérrez

1
Piękny. Często muszę dołączyć dwie tabele tymczasowe lub tymczasową do innej tabeli, w której nie potrzebuję wszystkich kolumn tymczasowych - zwłaszcza, że ​​w grę wchodzi grupowanie.
VISQL,

2
Bardzo dobrze. Pewnie rozwiązuje problem wyodrębnienia nazw kolumn.
Toster

1
@CeesTimmerman - jeśli masz zapytanie dotyczące zduplikowanych nazw kolumn, jest to osobny problem, NIEZALEŻNIE od tego, jakie podejście przyjmujesz. Google „Zmiana nazwy kolumny SQL” lub „Alias ​​kolumny SQL”. Coś w rodzaju SELECT table1.ID AS table1ID ...IIRC.
ToolmakerSteve

3
@ToolmakerSteve Ideą tego pytania jest określenie tylko tych kolumn, których nie potrzebujesz. Nazwy kolumn wymagałyby określenia wszystkich, powiedzmy, ponad 20 kolumn konkretnej tabeli.
Cees Timmerman,

289

Nie.

Najlepszą praktyką w zakresie konserwacji jest określenie tylko wymaganych kolumn.

Co najmniej 2 powody:

  • Dzięki temu umowa między klientem a bazą danych jest stabilna. Te same dane za każdym razem
  • Wydajność, obejmująca indeksy

Edytuj (lipiec 2011 r.):

Przeciągnięcie Columnswęzła z Eksploratora obiektów do tabeli powoduje umieszczenie listy kolumn CSV w oknie zapytania, co pozwala osiągnąć jeden z celów


3
nigdy nie wiedziałem o przeciąganiu kolumny, dziękuję GBN, że znowu uratowałeś dzień. musisz zarobić dużo $$ ze względu na twoją wiedzę sql
l

4
istnieją prawidłowe scenariusze z SELECT *, szczególnie w procedurach ETL. Myślę, że najlepszą odpowiedzią tutaj jest ta z dynamicznym SQL.
miszkin

1
Są przypadki, w których chcesz wybrać powiedz wszystkie dane dla studenta do eksploracji statystycznej, ale nie
obniżaj

3
„określ tylko wymagane kolumny” - brak kodowania na stałe
RM Haley

9
Chociaż odpowiedzi takie jak ta zdobywają dużo głosów, nie mają one dla mnie żadnej wartości. Pod względem koncepcyjnym możliwość „Wybierz * Z wyjątkiem ABC” nie stanowi już więcej problemu niż „Wybierz *” obsługiwany przez język. OP wyraźnie prosi o sposób na osiągnięcie czegoś. Osoba odpowiadająca na to pytanie nie ma możliwości dowiedzenia się, czy PO chce użyć tego w kodzie produkcyjnym, czy też po prostu ma natychmiastową potrzebę uruchomienia takiego zapytania podczas opracowywania kodu do bazy danych, więc wykład o dobrych standardach nie wnosi żadnej wartości.
Itsme2003

68

Jeśli nie chcesz ręcznie wpisywać nazwy każdej kolumny, możesz jej użyć Script Table As, klikając prawym przyciskiem myszy tabelę lub wyświetlając w SSMS w następujący sposób:

wprowadź opis zdjęcia tutaj

Następnie otrzymasz całe zaznaczone zapytanie w oknie edytora nowych zapytań, a następnie usuń niechcianą kolumnę w następujący sposób:

wprowadź opis zdjęcia tutaj

Gotowy


2
Jest to łatwiejsze niż wybranie wszystkich nazw kolumn i dodanie do nich przecinków.
shaijut

68

Zautomatyzowanym sposobem na to w SQL (SQL Server) jest:

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);

Co się stanie, jeśli wykonujesz zapytanie z wyniku CTE lub innego podzapytania? Prosty przykład: możesz utworzyć podzapytanie, które dołącza wynik row_number()do każdego wiersza, a następnie wykonaj łączenie przez row_number, a następnie zaznacz wszystko opróczrow_number wyniku z połączenia.
ely

43

Możesz utworzyć widok z kolumnami, które chcesz wybrać, a następnie możesz po prostu select *z widoku ...


8
Na początku moją reakcją było „jak to jest łatwiejsze niż tylko określenie kolumn”? Ale potem zdecydowałem, że z punktu widzenia konserwacji może to być poprawa.
ToolmakerSteve

1
Obsługuje to również optymalizator zapytań, a nie przeciwdziała mu za pomocą tabeli tymczasowej lub dynamicznego SQL.
underscore_d

30

Tak, jest to możliwe (ale nie zalecane).

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')

Objaśnienie kodu :

  1. Zadeklaruj zmienną, aby przechowywać listę nazw kolumn oddzielonych przecinkami. Domyślnie jest to NULL.
  2. Skorzystaj z widoku systemu, aby określić nazwy kolumn w naszej tabeli.
  3. Służy SELECT @variable = @variable + ... FROMdo konkatenacji nazw kolumn. Ten typ SELECTnie zwraca zestawu wyników. Jest to być może nieudokumentowane zachowanie, ale działa w każdej wersji SQL Server. Alternatywnie możesz użyć SET @variable = (SELECT ... FOR XML PATH(''))do połączenia łańcuchów.
  4. Użyj ISNULLfunkcji, aby wstawić przecinek, tylko jeśli nie jest to nazwa pierwszej kolumny. UżyjQUOTENAME funkcji do obsługi spacji i interpunkcji w nazwach kolumn.
  5. Użyj WHERE klauzuli, aby ukryć kolumny, których nie chcemy widzieć.
  6. Użyj EXEC (@variable), znanego również jako dynamiczny SQL , do rozpoznawania nazw kolumn w czasie wykonywania. Jest to potrzebne, ponieważ nie znamy nazw kolumn w czasie kompilacji.

Dzięki! To był klucz do rozwiązania mojego problemu .
Antonio

Mam jedno pytanie: z jakiego powodu drugi wybór należy umieścić w instrukcji EXEC? Widziałem, że jest to faktycznie konieczne, ale zastanawiam się, dlaczego nie mogę po prostu pisaćSELECT @columns FROM contact
Antonio

17

Podobnie jak inni powiedzieli, że nie ma sposobu, aby to zrobić, ale jeśli używasz Sql Server, używam sztuczki, aby zmienić dane wyjściowe na oddzielone przecinkami, a następnie

select top 1 * from table

i wytnij całą listę kolumn z okna wyjściowego. Następnie możesz wybrać kolumny, które chcesz, bez konieczności wpisywania ich wszystkich.


13
Zobacz moją wskazówkę dotyczącą przeciągania z SSMS
gbn

11

Zasadniczo nie możesz robić tego, co chcesz - ale możesz uzyskać odpowiednie narzędzia, które pomogą ci trochę ułatwić.

Jeśli spojrzysz na zapytanie SQL Red-Gate zapytanie , możesz wpisać „SELECT * FROM MyTable”, a następnie przesunąć kursor do tyłu za „*” i nacisnąć <TAB>, aby rozwinąć listę pól i usunąć te kilka pól, które nie potrzebuję

To nie jest idealne rozwiązanie - ale cholernie dobre! :-) Szkoda, że ​​Intellisense MS SQL Server Management Studio wciąż nie jest wystarczająco inteligentne, aby oferować tę funkcję .......

Marc


To dobrze, ale problem polega na tym, że twoje zapytanie może stać się ogromne. Byłoby miło mieć funkcję „oprócz”, nie dla kodu prod, ale zapytania ad-hoc.
Micheasz B.

8

nie, nie ma na to sposobu. być może możesz utworzyć niestandardowe widoki, jeśli jest to wykonalne w twojej sytuacji

EDYCJA Może być, jeśli twoja baza danych obsługuje wykonywanie dynamicznego sql u może napisać SP i przekazać kolumny, których nie chcesz widzieć i pozwolić mu dynamicznie utworzyć zapytanie i zwrócić wynik. Myślę, że jest to wykonalne przynajmniej w SQL Server


13
Jest to wykonalne, ale zwolniłbym osobę, która to robi.
Lieven Keersmaekers,

Klasyczny problem z czyszczeniem: Skopiuj dfata, którą chcesz zachować, do tabeli tymczasowej, obetnij dużą, ponownie wypełnij tabelą tymczasową. Musisz wykluczyć kolumnę tożsamości.
Volker,

8

Jeśli korzystasz z SQL Server Management Studio, wykonaj następujące czynności:

  1. Wpisz żądaną nazwę tabeli i wybierz ją
  2. Naciśnij Alt+F1
  3. o / p pokazuje kolumny w tabeli.
  4. Wybierz żądane kolumny
  5. Skopiuj i wklej je w wybranym zapytaniu
  6. Uruchom zapytanie.

Cieszyć się.


7

W SQL Management Studio można rozwinąć kolumny w Eksploratorze obiektów, a następnie przeciągnąć Columnselement drzewa do okna zapytania, aby uzyskać listę kolumn oddzieloną przecinkami.


6

Podsumowując, nie możesz tego zrobić, ale nie zgadzam się z całym powyższym komentarzem, istnieją „scenariusze”, w których możesz legalnie użyć * Po utworzeniu zapytania zagnieżdżonego w celu wybrania określonego zakresu z całej listy (np. stronicowanie) dlaczego na świecie chciałbyś określać każdą kolumnę w zewnętrznej instrukcji select, jeśli zrobiłeś to w wewnętrznej?


Czy możesz użyć jakiejś odmiany „innername. *” Do reprezentowania wewnętrznych kolumn, podobnie jak „SELECT table1. * ...” podczas łączenia?
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)

AKTUALIZACJA:

Możesz także utworzyć procedurę składowaną, aby zająć się tym zadaniem, jeśli będziesz go częściej używać. W tym przykładzie użyłem wbudowanej funkcji STRING_SPLIT (), która jest dostępna w SQL Server 2016+, ale jeśli potrzebujesz, istnieje wiele przykładów tego, jak ręcznie ją utworzyć na 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

A potem tylko:

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

5

Jeśli mówimy o procedurach, działa z tą sztuczką, aby wygenerować nowe zapytanie i WYKONAJ NATYCHMIAST :

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');

5

Czy istnieje sposób na wykluczenie kolumn z tabeli bez określenia wszystkich kolumn?

Używając deklaratywnego SQL w zwykły sposób, nie.

Myślę, że twoja proponowana składnia jest godna i dobra. W rzeczywistości język relacyjnych baz danych „Tutorial D” ma bardzo podobną składnię, w której po słowach kluczowych ALL BUTnastępuje zestaw atrybutów (kolumn).

Jednak SQL SELECT *już ma wiele błędów (odpowiedź @ Guffa tutaj jest typowym zastrzeżeniem), więc nie sądzę SELECT ALL BUT, że w najbliższym czasie przejdzie do SQL Standard.

Myślę, że najlepszym „obejściem” jest stworzenie VIEWtylko takich kolumn, jakich sobie życzysz SELECT * FROM ThatView.


1
@underscore_d: Teraz poprawiłem swoją odpowiedź.
onedaywhen

Fajnie, zgadzam się z Twoimi 2 ostatnimi akapitami. Informacje o samouczku D są interesujące, chociaż zwykle zgadzam się z tymi, którzy uważają, że select *jest wątpliwy - bardzo przydatny w przypadku rzeczy ad hoc i programów, które muszą ogólnie obsługiwać tabele danych, ale nie tak bardzo do budowania (bez lepszego słowa) „czyste” zapytania. Mimo to, nie będąc w standardzie ANSI, nie oznacza to, że Microsoft nie może dodać go do swojego dialektu, jak w przypadku wielu innych rzeczy, ale jestem sceptyczny, czy by to zrobili.
underscore_d

5

Nowoczesny dialekt SQL, taki jak BigQuery, oferuje doskonałe rozwiązanie

WYBIERZ * Z WYJĄTKIEM (nazwa kolumnyX, [nazwa kolumnyYY, ...])

Jest to bardzo potężna składnia SQL, która pozwala uniknąć długiej listy kolumn, które należy cały czas aktualizować z powodu zmian nazw kolumn tabeli. A tej funkcji brakuje w bieżącej implementacji SQL Server, a szkoda. Mamy nadzieję, że pewnego dnia Microsoft Azure będzie bardziej przyjazny dla naukowców.

Badacze danych lubią mieć możliwość szybkiego skracania zapytania i usuwania niektórych kolumn (z powodu duplikacji lub z innego powodu).

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


4

Postgres sql ma na to sposób

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

Schemat informacyjny 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

Powyższe dla mojej konkretnej przykładowej tabeli - generuje instrukcję SQL, która wygląda następująco

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


Chociaż teoretycznie może to odpowiedzieć na pytanie, lepiej byłoby zawrzeć tutaj istotne części odpowiedzi i podać odnośnik.
Bhargav Rao

3

Nie znam żadnej bazy danych, która to obsługuje (SQL Server, MySQL, Oracle, PostgreSQL). Zdecydowanie nie jest częścią standardów SQL, więc myślę, że musisz określić tylko te kolumny, które chcesz.

Można oczywiście zbudować instrukcję SQL dynamicznie i zlecić jej wykonanie przez serwer. Ale to otwiera możliwość zastrzyku SQL.


3

Wiem, że to trochę stare, ale właśnie natknąłem się na ten sam problem i szukałem odpowiedzi. Potem poprosiłem starszego programistę o pokazanie bardzo prostej sztuczki.

Jeśli używasz edytora zapytań w studiu zarządzania, rozwiń bazę danych, a następnie rozwiń wybraną tabelę, aby wyświetlić folder kolumn.

W swojej instrukcji select, po prostu zaznacz powyższy folder kolumn, do których istnieją odniesienia, a następnie przeciągnij i upuść go w oknie zapytania. Wklei wszystkie kolumny tabeli, a następnie po prostu usunie kolumnę tożsamości z listy kolumn ...


1
Tak, ale co, jeśli masz 5 dołączeń, pomysł byłby takiSELECT * Except(tableName.ColumnName) FROM ...
Paweł Cioch

Uważam to za przydatne :) Nie wiedziałem o tym, nie jest to jednak odpowiedź na pytanie tematyczne.
Fka

3

Najlepszym sposobem rozwiązania tego jest użycie widoku, który można utworzyć z wymaganymi kolumnami i pobrać z niego dane

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)

3
Co jeśli liczba kolumn jest duża, powiedzmy 100 i chcieliśmy WYBRAĆ wszystkie kolumny, ale jedną. Czy istnieje lepsze podejście?
KartikKannapur

5
Ten rodzaj mija się z celem. Wybierasz „id, data” w drugim połączeniu, które, jeśli chcesz to zrobić, po prostu zrób to w pierwszej kolejności.
keithpjolley

3

Jeśli chcesz wykluczyć wrażliwą kolumnę wielkości liter, na przykład hasło, robię to, aby ukryć wartość:

SELECT * , "" as password FROM tableName;


ten zadziałał dla mnie
Arun Prasad ES

1
Chociaż oczywiście nie powinieneś nigdy przechowywać haseł tekstowych w bazie danych. Przynajmniej powinny być one
zmyte

2

Cóż, powszechną najlepszą praktyką jest określanie, które kolumny chcesz, zamiast tylko *. Powinieneś więc tylko określić, które pola chcesz zwrócić.


2

Kolega doradził dobrą alternatywę:

  • Wykonaj SELECT INTO w poprzednim zapytaniu (z którego generujesz lub pobierasz dane) do tabeli (którą usuniesz po zakończeniu). To stworzy dla ciebie strukturę.
  • Wykonaj skrypt jako UTWÓRZ w nowym oknie zapytania.
  • Usuń niechciane kolumny. Sformatuj pozostałe kolumny w 1 linijce i wklej jako listę kolumn.
  • Usuń utworzoną tabelę.

Gotowy...

To nam bardzo pomogło.


1

Kliknij tabelę prawym przyciskiem myszy w Eksploratorze obiektów, wybierz 1000 najlepszych wierszy

Wyświetli wszystkie kolumny, a nie *. Następnie usuń niechciane kolumny. Powinno być znacznie szybsze niż samodzielne pisanie.

Następnie, gdy poczujesz, że to trochę za dużo pracy, pobierz SQL Gate Prompt Red Gate i wpisz ssf z tbl, przejdź do * i ponownie kliknij kartę.


1

Tego używam często w tym przypadku:

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 wygląda jak column1,column2,column5


1

Czasami ten sam program musi obsługiwać różne struktury baz danych. Nie mogłem więc użyć listy kolumn w programie, aby uniknąć błędów w selectinstrukcjach.

*daje mi wszystkie opcjonalne pola. Przed użyciem sprawdzam, czy pola istnieją w tabeli danych. To jest mój powód do używania *w select.

Tak radzę sobie z wyłączonymi polami:

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

Zastanów się nad opracowaniem / wyjaśnieniem pytania / problemu.
badfilms

1

Wiem, że to pytanie jest stare, ale mam nadzieję, że nadal może być pomocne. Odpowiedź jest inspirowana dyskusją na forach SQL Server . Możesz uczynić to procedurą składowaną . Można go również zmodyfikować, aby dodać więcej niż jedno oprócz pól.

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

0

Czy nie byłoby łatwiej to zrobić:

sp_help <table_name>

-Kliknij kolumnę „Nazwa kolumny”> Kopiuj> Wklej (tworzy listę pionową) do okna Nowe zapytanie i po prostu wpisz przecinki przed każdą wartością kolumny ... skomentuj kolumny, których nie chcesz ... znacznie mniej pisanie niż jakikolwiek kod tutaj oferowany i nadal możliwy do zarządzania.


„znacznie mniej pisania niż jakikolwiek oferowany tutaj kod” i znacznie więcej kłopotów niż przeciąganie węzła Kolumny do edytora zapytań lub innych doskonałych sposobów uzyskania listy. Mam na myśli tabele z wieloma 10 kolumnami?
underscore_d

0

Możesz pobrać SQL Complete z devart.com, który nie tylko rozwija * symbol wieloznaczny, podobnie jak SQL Monit z Czerwonej Bramy (jak opisano w odpowiedzi Cairnza), ale także zapewnia rozwijanie selektora kolumn z polami wyboru, w których możesz sprawdzić wszystkie kolumny, które chcesz na liście wyboru, a zostaną one wstawione automatycznie (a jeśli odznaczysz kolumnę, zostanie ona automatycznie usunięta z listy wyboru).


0

W SSMS jest łatwiejszy sposób dzięki IntelliSense i Aliasing . Spróbuj tego

  1. Kliknij edytor tekstowy prawym przyciskiem myszy i upewnij się, że IntelliSense jest włączony.
  2. Wpisz zapytanie z aliasem [SELECT t. * FROM tablename t].
  3. Przejdź do tekstu t. * I usuń * , a SSMS automatycznie wyświetli listę kolumn f alias tabeli.
Następnie możesz szybko określić tylko kolumny, których nie potrzebujesz, używając SSMS, aby napisać zaznaczenie do innego skryptu, a następnie wykonać więcej operacji kopiowania / wklejania. Używam tego cały czas.


Czy mógłbyś podać swoją odpowiedź na wykluczenie kolumny?
Kamiccolo,

@Kamiccolo - to, co opisuje DuckWork, jest działaniem RĘCZNYM. Wycinanie i wklejanie żądanych nazw kolumn. Mówi jedynie, że jest to sposób na łatwiejsze dostanie się do nazwisk, bez częstego pisania. Nie pomaga ci napisać zapytania, które mówi „wyklucz tę kolumnę”. Pomaga tylko utworzyć żądaną listę kolumn, którą następnie wklejasz do zapytania.
ToolmakerSteve
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.