SQL mengecualikan kolom menggunakan SELECT * [kecuali kolomA] DARI tableA?

733

Kita semua tahu bahwa untuk memilih semua kolom dari sebuah tabel, kita dapat menggunakan

SELECT * FROM tableA

Apakah ada cara untuk mengecualikan kolom dari tabel tanpa menentukan semua kolom?

SELECT * [except columnA] FROM tableA

Satu-satunya cara yang saya tahu adalah menentukan secara manual semua kolom dan mengecualikan kolom yang tidak diinginkan. Ini benar-benar memakan waktu jadi saya mencari cara untuk menghemat waktu dan usaha untuk hal ini, serta pemeliharaan di masa depan jika tabel memiliki kolom lebih / kurang.

pb2q
sumber
27
Akan sangat nyaman untuk memiliki fitur ini, bukan untuk dimasukkan ke dalam kode produksi, tetapi untuk tujuan pemecahan masalah. Contoh: Saya punya tabel yang memiliki beberapa kolom saya kueri, tetapi saya ingin dengan cepat menghilangkan satu atau dua kolom teks.
Mikha B.
Saya punya kebutuhan untuk ini ketika bekerja dengan openquery (meskipun saya membutuhkan fungsi di MySQL daripada SQL Server). Saya harus meminta database MySQL menggunakan SQL Server. Karena tabel MySQL memiliki kolom char lebar tetap, saya tidak bisa menggunakan SELECT *kueri (OLE DB memiliki masalah pemetaan itu). Saya tidak dapat menentukan kolom yang tepat karena saya tidak memiliki akses langsung ke database MySQL, namun SQL Server cukup berbaik hati untuk memberi tahu saya nama-nama kolom char lebar tetap ...
j14
2
Saya ingin menambahkan alasan lain untuk melakukan ini: SELECT DISTINCT *kecuali kolom kunci berfungsi tanpa baris duplikat yang dibuat orang lain
undrline
1
Saya setuju bahwa ini memakan waktu. Inilah sebabnya saya biasanya klik kanan pada tabel, pilih "pilih 1000 baris teratas", lalu hapus kolom yang tidak saya inginkan.
ThomasRones
2
jangan lupa: dalam banyak kasus pengembang tidak mengetahui kolom karena mereka dapat berubah. ini tipikal di gudang data. setelah 6 bulan, mereka menambahkan kolom tambahan dan itu harus dipilih tanpa mengubah kode.

Jawaban:

447

Saya setuju dengan semua orang ... tetapi jika saya akan melakukan sesuatu seperti ini saya mungkin melakukannya dengan cara ini:

/* 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
sumber
222
Tidak efisien ... tetapi sangat kreatif :)
Guillermo Gutiérrez
1
Cantik. Saya sering perlu menyertakan bergabung dengan dua tabel temp atau temp ke meja lain di mana saya tidak memerlukan semua kolom di temp - terutama karena pengelompokan akan terlibat.
VISQL
2
Sangat bagus. Tentu memecahkan masalah mengabstraksi nama kolom.
Pemanggang roti
1
@CeesTimmerman - jika Anda memiliki kueri yang melibatkan nama kolom duplikat, itu adalah masalah yang terpisah, TERKAIT dengan pendekatan mana yang Anda ambil. Google "Ganti nama kolom SQL" atau "alias kolom SQL". Sesuatu seperti SELECT table1.ID AS table1ID ..., IIRC.
ToolmakerSteve
3
@ToolmakerSteve Ide pertanyaan ini adalah hanya menentukan kolom yang tidak Anda butuhkan. Penamaan kolom akan membutuhkan menentukan semua, misalnya, 20+ kolom dari tabel tertentu.
Cees Timmerman
289

Tidak.

Praktik terbaik pemeliharaan-cahaya hanya menentukan kolom yang diperlukan.

Setidaknya 2 alasan:

  • Ini membuat kontrak Anda antara klien dan basis data stabil. Data yang sama, setiap saat
  • Kinerja, meliputi indeks

Edit (Juli 2011):

Jika Anda menyeret dari objek Explorer Columnsnode ke tabel, itu menempatkan daftar CSV kolom di Jendela Kueri untuk Anda yang mencapai salah satu tujuan Anda

gbn
sumber
3
saya tidak pernah tahu apa-apa tentang menyeret columsn terima kasih GBN Anda telah menyelamatkan hari ini. Anda harus menghasilkan banyak $$ karena keahlian sql Anda
l
4
ada skenario yang valid dengan SELECT *, terutama dalam rutinitas ETL. Saya pikir jawaban terbaik di sini adalah yang dengan SQL dinamis.
mishkin
1
Ada kasus-kasus di mana Anda ingin memilih mengatakan semua data untuk seorang siswa untuk eksplorasi statistik tetapi tidak menjatuhkan kawat identitas siswa itu sendiri untuk meningkatkan privasi
George Birbilis
3
"sebutkan hanya kolom yang diperlukan" - hard coding nonsence
RM Haley
9
Meskipun jawaban seperti ini mendapatkan banyak suara, mereka tidak memiliki nilai sejauh yang saya ketahui. Secara konseptual, bisa "Pilih * Kecuali ABC" tidak lagi bermasalah bahwa "Pilih *" yang didukung bahasa. OP jelas meminta cara untuk mencapai sesuatu. Orang yang menjawab pertanyaan ini tidak memiliki cara untuk mengetahui apakah OP ingin menggunakan ini dalam kode produksi atau jika mereka hanya memiliki kebutuhan mendesak untuk menjalankan kueri seperti ini ketika mereka sedang mengembangkan beberapa kode untuk database, sehingga kuliah tentang standar yang baik tidak memberikan nilai sama sekali.
Itsme2003
68

Jika Anda tidak ingin menulis setiap nama kolom secara manual, Anda dapat menggunakan Script Table Asdengan mengklik kanan pada tabel atau melihat dalam SSMS seperti ini:

masukkan deskripsi gambar di sini

Kemudian Anda akan mendapatkan seluruh kueri pemilihan di Jendela Editor Kueri Baru lalu menghapus kolom yang tidak diinginkan seperti ini:

masukkan deskripsi gambar di sini

Selesai

hims056
sumber
2
Ini lebih mudah daripada memilih semua nama kolom lalu menambahkan koma.
shaijut
68

Cara otomatis untuk melakukan ini dalam SQL (SQL Server) adalah:

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
sumber
Bagaimana jika Anda meminta dari hasil CTE atau subquery lainnya? Contoh sederhana: Anda mungkin ingin membuat subquery yang menambahkan hasil row_number()untuk setiap baris, lalu melakukan gabungan dengan row_number, lalu pilih semua yang mengecualikanrow_number dari hasil gabungan.
ely
43

Anda dapat membuat tampilan yang memiliki kolom yang ingin Anda pilih, maka Anda hanya dapat select *dari tampilan ...

campo
sumber
8
Awalnya reaksi saya adalah "bagaimana ini lebih mudah daripada hanya menentukan kolom"? Tapi kemudian saya memutuskan bahwa dari sudut pandang pemeliharaan, itu mungkin perbaikan.
ToolmakerSteve
1
Ini juga mendukung pengoptimal kueri daripada menangkalnya dengan tabel temp atau SQL dinamis.
underscore_d
30

Ya itu mungkin (tetapi tidak disarankan).

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

Penjelasan kode :

  1. Deklarasikan variabel untuk menyimpan daftar nama kolom yang dipisahkan koma. Ini default ke NULL.
  2. Gunakan tampilan sistem untuk menentukan nama-nama kolom dalam tabel kami.
  3. Gunakan SELECT @variable = @variable + ... FROMuntuk menggabungkan nama kolom. Jenis SELECTini tidak mengembalikan kumpulan hasil. Ini mungkin perilaku tidak berdokumen tetapi berfungsi di setiap versi SQL Server. Sebagai alternatif, Anda bisa menggunakannya SET @variable = (SELECT ... FOR XML PATH(''))untuk menggabungkan string.
  4. Gunakan ISNULLfungsi untuk menambahkan koma hanya jika ini bukan nama kolom pertama. Gunakan QUOTENAMEfungsi untuk mendukung spasi dan tanda baca dalam nama kolom.
  5. Gunakan WHEREklausa untuk menyembunyikan kolom yang tidak ingin kita lihat.
  6. Gunakan EXEC (@variable), juga dikenal sebagai SQL dinamis , untuk menyelesaikan nama kolom saat runtime. Ini diperlukan karena kami tidak tahu nama kolom pada waktu kompilasi.
Anthony Faull
sumber
Terima kasih! Ini adalah kunci untuk menyelesaikan masalah saya .
Antonio
Saya punya satu pertanyaan: untuk alasan apa pemilihan kedua harus dimasukkan ke dalam pernyataan EXEC? Saya telah melihat bahwa itu perlu secara efektif, tetapi saya bertanya-tanya mengapa saya tidak bisa begitu saja menulisSELECT @columns FROM contact
Antonio
17

Seperti yang dikatakan orang lain, tidak ada cara untuk melakukan ini, tetapi jika Anda menggunakan Sql Server, trik yang saya gunakan adalah mengubah output menjadi koma terpisah, lalu lakukan

select top 1 * from table

dan memotong seluruh daftar kolom dari jendela output. Kemudian Anda dapat memilih kolom mana yang Anda inginkan tanpa harus mengetik semuanya.

Tuan
sumber
13
Lihat tip saya tentang menyeret dari SSMS
gbn
11

Pada dasarnya, Anda tidak dapat melakukan apa yang Anda inginkan - tetapi Anda bisa mendapatkan alat yang tepat untuk membantu Anda membuat segalanya lebih mudah.

Jika Anda melihat Prompt SQL Red-Gate , Anda dapat mengetik "SELECT * FROM MyTable", dan kemudian pindahkan kursor kembali setelah "*", dan tekan <TAB> untuk memperluas daftar bidang, dan menghapus beberapa bidang yang Anda tidak perlu.

Ini bukan solusi yang sempurna - tetapi solusi yang sangat bagus! :-) Sayang sekali Intellisense MS SQL Server Management Studio masih tidak cukup cerdas untuk menawarkan fitur ini .......

Marc

marc_s
sumber
Ini bagus, tetapi masalahnya adalah permintaan Anda bisa menjadi besar. Akan menyenangkan untuk memiliki fitur "kecuali", bukan untuk kode prod, tetapi permintaan ad-hoc.
Micah B.
8

tidak ada cara untuk melakukan ini. mungkin Anda dapat membuat tampilan khusus jika itu layak dalam situasi Anda

EDIT Mungkin jika DB Anda mendukung eksekusi sql dinamis, Anda dapat menulis SP dan meneruskan kolom yang tidak ingin Anda lihat dan membiarkannya membuat kueri secara dinamis dan mengembalikan hasilnya kepada Anda. Saya pikir ini bisa dilakukan di SQL Server minimal

Ali Kazmi
sumber
13
Itu bisa dilakukan tetapi saya akan memecat orang yang melakukan itu.
Lieven Keersmaekers
Masalah pembersihan klasik: Salin data yang ingin Anda simpan ke tabel temp, potong yang besar, isi ulang dengan tabel temp. Anda perlu mengecualikan kolom identitas.
Volker
8

Jika Anda menggunakan SQL Server Management Studio maka lakukan sebagai berikut:

  1. Ketikkan nama tabel yang Anda inginkan dan pilih
  2. Tekan Alt+F1
  3. o / p menunjukkan kolom dalam tabel.
  4. Pilih kolom yang diinginkan
  5. Salin & tempel yang ada di kueri pilihan Anda
  6. Jalankan kueri.

Nikmati.

asdasdasd
sumber
7

Di SQL Management Studio Anda dapat memperluas kolom di Object Explorer, lalu seret Columnsitem pohon ke jendela kueri untuk mendapatkan daftar kolom yang dipisahkan koma.

cjk
sumber
6

Singkatnya, Anda tidak dapat melakukannya, tetapi saya tidak setuju dengan semua komentar di atas, ada "ada" skenario di mana Anda dapat secara sah menggunakan * Ketika Anda membuat kueri bersarang untuk memilih rentang tertentu dari seluruh daftar (seperti paging) mengapa di dunia ingin menentukan setiap kolom pada pernyataan pilih luar ketika Anda telah melakukannya di bagian dalam?

Shrage Smilowitz
sumber
Bisakah Anda menggunakan beberapa variasi "nama pengguna. *" Untuk mewakili kolom bagian dalam, mirip dengan "SELECT table1. * ..." saat melakukan join?
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)

MEMPERBARUI:

Anda juga dapat membuat prosedur tersimpan untuk menangani tugas ini jika Anda menggunakannya lebih sering. Dalam contoh ini saya telah menggunakan built in STRING_SPLIT () yang tersedia di SQL Server 2016+, tetapi jika Anda perlu ada beberapa contoh cara membuatnya secara manual pada 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

Dan kemudian:

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

Jika kita berbicara tentang Prosedur, ini berfungsi dengan trik ini untuk menghasilkan kueri baru dan Jalankan SEGERA :

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
sumber
5

Apakah ada cara untuk mengecualikan kolom dari tabel tanpa menentukan semua kolom?

Menggunakan SQL deklaratif dengan cara biasa, tidak.

Saya pikir sintaks yang Anda usulkan layak dan bagus. Bahkan, bahasa database relasional 'Tutorial D' memiliki sintaksis yang sangat mirip di mana kata kunci ALL BUTdiikuti oleh serangkaian atribut (kolom).

Namun, SQL SELECT *sudah mendapatkan banyak kritik (@ jawaban Guffa di sini adalah keberatan yang khas), jadi saya tidak berpikir SELECT ALL BUTakan masuk ke dalam SQL Standard dalam waktu dekat.

Saya pikir yang terbaik 'bekerja di sekitar' adalah dengan membuat VIEWhanya dengan kolom yang Anda inginkan SELECT * FROM ThatView.

suatu hari nanti
sumber
1
@underscore_d: Sekarang saya telah merevisi jawaban saya.
onedaywhen
Keren, saya setuju dengan 2 paragraf terakhir Anda. Info tentang Tutorial D menarik, walaupun saya cenderung setuju dengan mereka yang menganggapnya select *dipertanyakan - sangat berguna untuk hal-hal dan program ad hoc yang perlu menangani tabel data secara umum, tetapi tidak terlalu banyak untuk membangun (karena tidak ada kata yang lebih baik) pertanyaan 'murni'. Tetap saja, tidak berada dalam standar ANSI tidak berarti Microsoft tidak dapat menambahkannya ke dialek mereka, seperti banyak hal lainnya, tetapi saya ragu apakah mereka akan melakukannya.
underscore_d
5

Dialek SQL modern seperti BigQuery mengusulkan solusi yang sangat baik

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

Ini adalah sintaks SQL yang sangat kuat untuk menghindari daftar panjang kolom yang perlu diperbarui setiap saat karena perubahan nama kolom tabel. Dan fungsi ini hilang dalam implementasi SQL Server saat ini, yang sangat disayangkan. Semoga, suatu hari, Microsoft Azure akan lebih ramah data ilmuwan.

Ilmuwan data ingin dapat memiliki opsi cepat untuk mempersingkat kueri dan dapat menghapus beberapa kolom (karena duplikasi atau alasan lain).

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

Velizar VESSELINOV
sumber
4

Sql Postgres memiliki cara untuk melakukannya

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

Cara Peretasan Skema Informasi

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

Di atas untuk tabel contoh khusus saya - menghasilkan pernyataan sql yang terlihat seperti ini

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

pengguna3393089
sumber
Sementara ini secara teoritis dapat menjawab pertanyaan, akan lebih baik untuk memasukkan bagian-bagian penting dari jawaban di sini, dan menyediakan tautan untuk referensi.
Bhargav Rao
3

Saya tidak tahu ada database yang mendukung ini (SQL Server, MySQL, Oracle, PostgreSQL). Ini jelas bukan bagian dari standar SQL jadi saya pikir Anda harus menentukan hanya kolom yang Anda inginkan.

Anda tentu saja dapat membangun pernyataan SQL Anda secara dinamis dan meminta server untuk menjalankannya. Tapi ini membuka kemungkinan untuk injeksi SQL ..

Ronald Wildenberg
sumber
3

Saya tahu ini agak tua, tetapi saya baru saja mengalami masalah yang sama dan sedang mencari jawaban. Kemudian saya meminta pengembang senior untuk menunjukkan trik yang sangat sederhana.

Jika Anda menggunakan editor kueri studio manajemen, perluas basis data, lalu rentangkan tabel yang Anda pilih sehingga Anda bisa melihat folder kolom.

Dalam pernyataan pilih Anda, cukup sorot folder kolom yang direferensikan di atas dan seret dan letakkan di jendela permintaan. Ini akan menempelkan semua kolom tabel, lalu cukup hapus kolom identitas dari daftar kolom ...

anonim
sumber
1
Ya, tetapi bagaimana jika Anda memiliki 5 bergabung, idenya adalahSELECT * Except(tableName.ColumnName) FROM ...
Pawel Cioch
Saya menemukan ini berguna :) Saya belum tahu tentang itu, namun ini bukan jawaban untuk pertanyaan topik.
Fka
3

Cara terbaik untuk mengatasi ini adalah menggunakan tampilan Anda dapat membuat tampilan dengan kolom yang diperlukan dan mengambil data dari itu

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
sumber
3
Bagaimana jika jumlah kolom besar, katakan 100 & kami ingin SELECT semua kolom, kecuali satu. Apakah ada pendekatan yang lebih baik?
KartikKannapur
5
Jenis yang satu ini melenceng. Anda memilih "id, tanggal" di panggilan kedua, yang, jika Anda akan melakukannya, lakukan saja di tempat pertama.
keithpjolley
3

Misalnya, jika Anda ingin mengecualikan kolom case sensitif seperti kata sandi, saya melakukan ini untuk menyembunyikan nilainya:

SELECT * , "" as password FROM tableName;

Lu Blue
sumber
ini bekerja untuk saya
Arun Prasad ES
1
Meskipun Anda tentu saja tidak boleh menyimpan kata sandi teks-jelas di database Anda. Setidaknya mereka harus hash dengan garam dan merica mungkin security.stackexchange.com/questions/3272/...
Anders_K
2

Ya, itu adalah praktik terbaik yang umum untuk menentukan kolom mana yang Anda inginkan, bukan hanya menentukan *. Jadi Anda hanya harus menyatakan bidang mana yang ingin Anda pilih untuk dikembalikan.

Gustavo
sumber
2

Seorang kolega menyarankan alternatif yang baik:

  • Lakukan SELECT INTO dalam kueri sebelumnya (tempat Anda menghasilkan atau mendapatkan data) ke dalam tabel (yang akan Anda hapus saat selesai). Ini akan membuat struktur untuk Anda.
  • Lakukan skrip sebagai BUAT ke jendela kueri baru.
  • Hapus kolom yang tidak diinginkan. Format kolom yang tersisa menjadi 1 liner dan rekatkan sebagai daftar kolom Anda.
  • Hapus tabel yang Anda buat.

Selesai ...

Ini sangat membantu kami.

Charl
sumber
1

Klik kanan tabel di Object Explorer, Pilih 1000 baris teratas

Ini akan mencantumkan semua kolom dan bukan *. Kemudian hapus kolom yang tidak diinginkan. Seharusnya lebih cepat daripada mengetik sendiri.

Kemudian ketika Anda merasa ini adalah pekerjaan yang terlalu banyak, dapatkan Prompt SQL Red Gate, dan ketik ssf dari tbl, buka * dan klik tab lagi.

cairnz
sumber
1

Itulah yang sering saya gunakan untuk kasus ini:

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 seperti column1,column2,column5

Valeriy
sumber
1

Terkadang program yang sama harus menangani struktur database yang berbeda. Jadi saya tidak bisa menggunakan daftar kolom dalam program untuk menghindari kesalahan dalam selectpernyataan.

*memberi saya semua bidang opsional. Saya memeriksa apakah bidang ada di tabel data sebelum digunakan. Ini adalah alasan saya untuk menggunakan *diselect .

Inilah cara saya menangani bidang yang dikecualikan:

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
sumber
Pertimbangkan menguraikan / mengklarifikasi pertanyaan / masalah Anda.
badfilms
1

Saya tahu pertanyaan ini sudah lama, tapi saya harap ini masih bisa membantu. Jawabannya terinspirasi oleh diskusi dari Forum SQL Server . Anda dapat menjadikan ini sebagai prosedur tersimpan . Itu juga dapat dimodifikasi untuk menambahkan lebih dari satu kecuali bidang.

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
sumber
0

Bukankah lebih mudah untuk melakukan ini:

sp_help <table_name>

-Klik pada kolom 'Column_name'> Salin> Tempel (membuat daftar vertikal) ke dalam jendela Permintaan Baru dan cukup ketik koma di depan setiap nilai kolom ... komentar kolom yang tidak Anda inginkan ... jauh lebih sedikit mengetik daripada kode apa pun yang ditawarkan di sini dan masih dapat dikelola.

plo
sumber
"mengetik jauh lebih sedikit daripada kode apa pun yang ditawarkan di sini" dan jauh lebih merepotkan daripada menyeret simpul Kolom ke editor kueri atau cara unggul lainnya untuk mendapatkan daftar. Maksud saya bagaimana dengan tabel dengan 10s kolom?
underscore_d
0

Anda bisa mendapatkan SQL Complete dari devart.com, yang tidak hanya memperluas * wildcard seperti halnya SQL Prompt dari Red Gate (seperti yang dijelaskan dalam jawaban cairnz), tetapi juga menyediakan pemilih kolom drop-down dengan kotak centang di mana Anda dapat memeriksa semua kolom yang Anda inginkan dalam daftar pilih dan mereka akan dimasukkan secara otomatis untuk Anda (dan jika Anda menghapus centang kolom itu akan secara otomatis dihapus dari daftar pilih).

halo yoel
sumber
0

Di SSMS ada cara yang lebih mudah dengan IntelliSense dan Aliasing . Coba ini

  1. Klik kanan di editor teks dan pastikan IntelliSense diaktifkan.
  2. Ketik kueri dengan alias [PILIH t. * DARI nama tab t].
  3. Buka teks t. * Dan hapus * , dan SSMS akan secara otomatis mencantumkan kolom f alias meja.
Anda kemudian dapat dengan cepat menentukan hanya kolom yang Anda inginkan tanpa harus menggunakan SSMS untuk menulis pilih ke skrip lain dan kemudian melakukan lebih banyak operasi salin / tempel. Saya menggunakan ini sepanjang waktu.

Michael Barash
sumber
Bisakah Anda menentukan jawaban Anda untuk pengecualian kolom?
Kamiccolo
@Kamiccolo - apa yang dijelaskan oleh DuckWork adalah tindakan MANUAL. Memotong dan menempelkan nama kolom yang diinginkan. Dia hanya mengatakan ini adalah cara untuk lebih mudah mendapatkan nama-nama itu, tanpa banyak mengetik. Itu tidak membantu Anda menulis kueri yang mengatakan "kecualikan kolom ini". Ini hanya membantu Anda membuat daftar kolom yang diinginkan, yang kemudian Anda tempelkan ke dalam kueri Anda.
ToolmakerSteve