SQL loại trừ một cột bằng CHỌN * [trừ cộtA] TỪ bảngA?


733

Chúng ta đều biết rằng để chọn tất cả các cột từ một bảng, chúng ta có thể sử dụng

SELECT * FROM tableA

Có cách nào để loại trừ (các) cột khỏi một bảng mà không chỉ định tất cả các cột không?

SELECT * [except columnA] FROM tableA

Cách duy nhất mà tôi biết là chỉ định thủ công tất cả các cột và loại trừ cột không mong muốn. Điều này thực sự tốn thời gian, vì vậy tôi đang tìm cách tiết kiệm thời gian và công sức cho việc này, cũng như bảo trì trong tương lai nếu bảng có nhiều / ít cột hơn.


27
Sẽ rất thuận tiện khi có tính năng này, không đưa mã sản xuất, nhưng cho mục đích khắc phục sự cố. Ví dụ: Tôi có một bảng có nhiều cột tôi truy vấn, nhưng tôi muốn nhanh chóng bỏ qua một hoặc hai cột văn bản.
Mi-chê

Tôi đã có nhu cầu này khi làm việc với openquery (mặc dù tôi cần chức năng trong MySQL chứ không phải SQL Server). Tôi đã phải truy vấn cơ sở dữ liệu MySQL bằng SQL Server. Vì bảng MySQL có các cột char có chiều rộng cố định, tôi không thể sử dụng SELECT *truy vấn (OLE DB có vấn đề ánh xạ các cột đó). Tôi không thể chỉ định các cột bên phải vì tôi không có quyền truy cập trực tiếp vào cơ sở dữ liệu MySQL, tuy nhiên SQL Server đủ tử tế để thông báo cho tôi tên của các cột char có chiều rộng cố định ...
jahu

2
Tôi muốn thêm một lý do khác để làm điều này: SELECT DISTINCT *ngoại trừ cột khóa hoạt động mà không có hàng trùng lặp do người khác tạo
hủy

1
Tôi đồng ý rằng nó là tốn thời gian. Đây là lý do tại sao tôi thường chỉ cần nhấp chuột phải vào bảng, chọn "chọn 1000 hàng trên cùng", sau đó xóa các cột mà tôi không muốn.
ThomasRones

2
đừng quên: trong nhiều trường hợp, nhà phát triển không biết các cột vì chúng có thể thay đổi. đây là điển hình trong kho dữ liệu. Sau 6 tháng, họ thêm một cột bổ sung và nó sẽ được chọn mà không thay đổi mã.

Câu trả lời:


447

Tôi đồng ý với tất cả mọi người ... nhưng nếu tôi định làm một cái gì đó như thế này thì tôi có thể làm theo cách này:

/* 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
Không hiệu quả ... nhưng rất sáng tạo :)
Guillermo Gutiérrez

1
Xinh đẹp. Tôi thường cần bao gồm nối hai bảng tạm thời hoặc tạm thời sang một bảng khác trong đó tôi không cần tất cả các cột trong temp - đặc biệt là vì việc phân nhóm sẽ được tham gia.
VISQL

2
Rất đẹp. Chắc chắn giải quyết vấn đề trừu tượng hóa các tên cột.
Máy nướng bánh mì

1
@CeesTimmerman - nếu bạn có một truy vấn liên quan đến các tên cột trùng lặp, đó là một vấn đề riêng biệt, HÃY THAM GIA cách tiếp cận mà bạn đang thực hiện. Google "đổi tên cột SQL" hoặc "bí danh cột SQL". Một cái gì đó như SELECT table1.ID AS table1ID ..., IIRC.
ToolmakerSteve

3
@ToolmakerSteve Ý tưởng của câu hỏi này là chỉ xác định các cột bạn không cần. Các cột đặt tên sẽ yêu cầu chỉ định tất cả, giả sử, hơn 20 cột của một bảng cụ thể.
Cees Timmerman

289

Không.

Bảo trì - thực hành tốt nhất là chỉ định các cột cần thiết.

Ít nhất 2 lý do:

  • Điều này làm cho hợp đồng của bạn giữa khách hàng và cơ sở dữ liệu ổn định. Dữ liệu giống nhau, mọi lúc
  • Hiệu suất, bao gồm các chỉ số

Chỉnh sửa (tháng 7 năm 2011):

Nếu bạn kéo từ Object Explorer Columnsnút cho một bảng, nó sẽ đặt danh sách các cột CSV trong Cửa sổ truy vấn để bạn đạt được một trong những mục tiêu của mình


3
tôi chưa bao giờ biết điều gì về việc kéo columsn cảm ơn bạn GBN bạn đã lưu lại ngày hôm đó. bạn phải kiếm được nhiều $$ do chuyên môn sql của bạn
l --'''''--------- '' '' '' '' '' '' '

4
có các kịch bản hợp lệ với SELECT *, đặc biệt là trong các thói quen ETL. Tôi nghĩ rằng câu trả lời tốt nhất ở đây là câu trả lời với SQL động.
mishkin

1
Có những trường hợp bạn muốn chọn nói tất cả dữ liệu cho một sinh viên để khám phá thống kê nhưng không hạ thấp dây của chính id sinh viên để củng cố quyền riêng tư
George Birbilis

3
"Chỉ chỉ định các cột bắt buộc" - vô nghĩa mã hóa cứng
RM Haley

9
Mặc dù câu trả lời như thế này nhận được rất nhiều phiếu bầu, nhưng chúng không có giá trị như tôi quan tâm. Về mặt khái niệm, việc có thể "Chọn * Ngoại trừ ABC" không còn là vấn đề nữa khi "Chọn *" mà ngôn ngữ hỗ trợ. OP rõ ràng đang yêu cầu một cách để hoàn thành một cái gì đó. Người trả lời câu hỏi này không có cách nào để biết liệu OP muốn sử dụng điều này trong mã sản xuất hay nếu họ có nhu cầu ngay lập tức để chạy một truy vấn như thế này trong khi họ đang phát triển một số mã cho cơ sở dữ liệu, vì vậy bài giảng về các tiêu chuẩn tốt đóng góp không có giá trị nào cả.
Itsme2003

68

Nếu bạn không muốn viết từng tên cột theo cách thủ công, bạn có thể sử dụng Script Table Asbằng cách nhấp chuột phải vào bảng hoặc xem trong SSMS như thế này:

nhập mô tả hình ảnh ở đây

Sau đó, bạn sẽ nhận được toàn bộ truy vấn chọn trong Cửa sổ Trình soạn thảo Truy vấn Mới, sau đó xóa cột không mong muốn như thế này:

nhập mô tả hình ảnh ở đây

Làm xong


2
Điều này dễ dàng hơn việc chọn tất cả các tên cột sau đó thêm dấu phẩy vào nó.
shaijut

68

Cách tự động để làm điều này trong SQL (SQL Server) là:

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

Điều gì nếu bạn đang truy vấn từ kết quả của CTE hoặc truy vấn con khác? Một ví dụ đơn giản: bạn có thể muốn thực hiện một truy vấn con nối thêm kết quả của row_number()từng hàng, sau đó thực hiện phép nối bằng cách row_numberchọn, sau đó chọn mọi thứ trừrow_number kết quả của phép nối.
ely

43

Bạn có thể tạo chế độ xem có các cột bạn muốn chọn, sau đó bạn có thể chỉ select *từ chế độ xem ...


8
Đầu tiên, phản ứng của tôi là "làm thế nào dễ hơn là chỉ định các cột"? Nhưng sau đó tôi quyết định rằng từ góc độ bảo trì, nó có thể là một sự cải tiến.
ToolmakerSteve

1
Điều này cũng hỗ trợ trình tối ưu hóa truy vấn thay vì chống lại nó bằng bảng tạm thời hoặc SQL động.
gạch dưới

30

Có, điều đó là có thể (nhưng không nên).

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

Giải thích về mã :

  1. Khai báo một biến để lưu danh sách tên cột được phân tách bằng dấu phẩy. Điều này mặc định cho NULL.
  2. Sử dụng chế độ xem hệ thống để xác định tên của các cột trong bảng của chúng tôi.
  3. Sử dụng SELECT @variable = @variable + ... FROMđể nối các tên cột. Loại SELECTnày không trả về một tập kết quả. Đây có thể là hành vi không có giấy tờ nhưng hoạt động trong mọi phiên bản của SQL Server. Thay thế bạn có thể sử dụngSET @variable = (SELECT ... FOR XML PATH('')) để nối chuỗi.
  4. Sử dụng ISNULLhàm để chỉ thêm dấu phẩy nếu đây không phải là tên cột đầu tiên. Sử dụng QUOTENAMEhàm để hỗ trợ dấu cách và dấu chấm câu trong tên cột.
  5. Sử dụng WHEREmệnh đề để ẩn các cột mà chúng ta không muốn xem.
  6. Sử dụng EXEC (@variable), còn được gọi là SQL động , để giải quyết các tên cột khi chạy. Điều này là cần thiết bởi vì chúng tôi không biết tên cột tại thời gian biên dịch.

Cảm ơn! Đây là chìa khóa để giải quyết vấn đề của tôi .
Antonio

Tôi có một câu hỏi: vì lý do nào mà lựa chọn thứ hai phải được đưa vào một tuyên bố EXEC? Tôi đã thấy rằng nó thực sự cần thiết, nhưng tôi tự hỏi tại sao tôi không thể đơn giản viếtSELECT @columns FROM contact
Antonio

17

Giống như những người khác đã nói không có cách nào để làm điều này, nhưng nếu bạn đang sử dụng Sql Server, một mẹo mà tôi sử dụng là thay đổi đầu ra thành dấu phẩy được phân tách, thì hãy làm

select top 1 * from table

và cắt toàn bộ danh sách các cột từ cửa sổ đầu ra. Sau đó, bạn có thể chọn cột nào bạn muốn mà không cần phải nhập tất cả chúng vào.


13
Xem mẹo của tôi về việc kéo từ SSMS
gbn

11

Về cơ bản, bạn không thể làm những gì bạn muốn - nhưng bạn có thể có được các công cụ phù hợp để giúp bạn làm mọi thứ dễ dàng hơn một chút.

Nếu bạn nhìn vào Dấu nhắc SQL của Red-Gate , bạn có thể nhập "CHỌN * TỪ MyTable", sau đó di chuyển con trỏ trở lại sau "*" và nhấn <TAB> để mở rộng danh sách các trường và xóa vài trường đó bạn không cần.

Đó không phải là một giải pháp hoàn hảo - mà là một giải pháp tốt! :-) Quá tệ Intellisense của MS SQL Server Management Studio vẫn không đủ thông minh để cung cấp tính năng này .......

Marc


Điều này là tốt, nhưng vấn đề là truy vấn của bạn có thể trở nên rất lớn. Sẽ thật tuyệt nếu có tính năng "ngoại trừ", không phải cho mã prod, mà là truy vấn đặc biệt.
Mi-chê

8

không có cách nào để làm điều này có lẽ bạn có thể tạo chế độ xem tùy chỉnh nếu điều đó khả thi trong tình huống của bạn

EDIT Có thể nếu DB của bạn hỗ trợ thực thi sql động, bạn có thể viết SP và chuyển các cột mà bạn không muốn xem và để nó tự động tạo truy vấn và trả về kết quả cho bạn. Tôi nghĩ rằng điều này là có thể thực hiện được trong SQL Server ít nhất


13
Điều đó là có thể làm được nhưng tôi sẽ sa thải người làm việc đó.
Lieven Keersmaekers

Vấn đề dọn dẹp cổ điển: Sao chép dfata bạn muốn giữ vào bảng tạm thời, cắt bớt cái lớn, điền lại vào bảng tạm thời. Bạn cần loại trừ cột danh tính.
Volker

8

Nếu bạn đang sử dụng SQL Server Management Studio thì hãy làm như sau:

  1. Nhập tên bảng mong muốn của bạn và chọn nó
  2. Nhấn Alt+F1
  3. o / p hiển thị các cột trong bảng.
  4. Chọn các cột mong muốn
  5. Sao chép và dán chúng trong truy vấn chọn của bạn
  6. Bắn truy vấn.

Thưởng thức.


7

Trong SQL Management Studio, bạn có thể mở rộng các cột trong Object Explorer, sau đó kéo Columnsmục cây vào cửa sổ truy vấn để lấy danh sách các cột được phân tách bằng dấu phẩy.


6

Tóm lại bạn không thể làm điều đó, nhưng tôi không đồng ý với tất cả các nhận xét ở trên, có những tình huống "có" khi bạn có thể sử dụng hợp pháp * Khi bạn tạo một truy vấn lồng nhau để chọn một phạm vi cụ thể trong toàn bộ danh sách (chẳng hạn như phân trang) tại sao trên thế giới muốn chỉ định từng cột trên câu lệnh chọn bên ngoài khi bạn đã thực hiện nó ở bên trong?


Bạn có thể sử dụng một số biến thể của "tên người dùng. *" Để thể hiện các cột bên trong, tương tự như "CHỌN bảng1. * ..." khi thực hiện nối?
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)

CẬP NHẬT:

Bạn cũng có thể tạo một thủ tục được lưu trữ để đảm nhiệm công việc này nếu bạn sử dụng nó thường xuyên hơn. Trong ví dụ này, tôi đã sử dụng tính năng tích hợp trong STRINGinksLIT () có sẵn trên SQL Server 2016+, nhưng nếu bạn cần có nhiều ví dụ về cách tạo thủ công trên 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

Và sau đó chỉ:

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

5

Nếu chúng ta đang nói về Thủ tục, nó hoạt động với thủ thuật này để tạo một truy vấn mới và THỰC HIỆN NGAY LẬP TỨC :

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

Có cách nào để loại trừ (các) cột khỏi một bảng mà không chỉ định tất cả các cột không?

Sử dụng SQL khai báo theo cách thông thường, không.

Tôi nghĩ rằng cú pháp đề xuất của bạn là xứng đáng và tốt. Trong thực tế, ngôn ngữ cơ sở dữ liệu quan hệ 'Hướng dẫn D' có cú pháp rất giống nhau trong đó các từ khóa ALL BUTđược theo sau bởi một tập hợp các thuộc tính (cột).

Tuy nhiên, SQL SELECT *đã nhận được rất nhiều lời khen ngợi (câu trả lời của @ Guffa ở đây là một sự phản đối điển hình), vì vậy tôi không nghĩ SELECT ALL BUTsẽ sớm nhận được Tiêu chuẩn SQL.

Tôi nghĩ rằng 'công việc tốt nhất' là tạo ra VIEWchỉ với các cột mà bạn mong muốn SELECT * FROM ThatView.


1
@underscore_d: Bây giờ tôi đã sửa đổi câu trả lời của mình.
ngày

Thật tuyệt, tôi đồng ý với 2 đoạn cuối của bạn. Thông tin về Hướng dẫn D rất thú vị, mặc dù tôi có xu hướng đồng ý với những người cho rằng select *có vấn đề - rất hữu ích cho các chương trình và công cụ quảng cáo cần xử lý chung các bảng dữ liệu, nhưng không quá nhiều để xây dựng (thiếu từ tốt hơn) truy vấn 'thuần túy'. Tuy nhiên, việc không tuân theo tiêu chuẩn ANSI không có nghĩa là Microsoft không thể thêm nó vào phương ngữ của họ, như với nhiều thứ khác, nhưng tôi nghi ngờ liệu họ có làm như vậy không.
gạch dưới

5

Một phương ngữ SQL hiện đại như BigQuery đề xuất một giải pháp tuyệt vời

CHỌN * NGOẠI TRỪ (Cột TênX, [Cột Tên, ...])

Đây là một cú pháp SQL rất mạnh để tránh một danh sách dài các cột cần được cập nhật mọi lúc do thay đổi tên cột của bảng. Và chức năng này bị thiếu trong triển khai SQL Server hiện tại, thật đáng tiếc. Hy vọng rằng một ngày nào đó, Microsoft Azure sẽ trở nên thân thiện với nhà khoa học dữ liệu hơn.

Các nhà khoa học dữ liệu muốn có thể có một tùy chọn nhanh để rút ngắn một truy vấn và có thể xóa một số cột (do trùng lặp hoặc bất kỳ lý do nào khác).

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


4

Postgres sql có một cách làm

vui lòng tham khảo: http://www.postgresonline.com/journal/archives/41-How-to-SELECT-ALL-EXCEPT-some-columns-in-a-table.html

Cách thức lược đồ thông tin

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

Bảng trên cho ví dụ cụ thể của tôi - tạo ra một câu lệnh sql trông như thế này

CHỌN o.officepark, o.owner, o.sapes feetage TỪ officepark Như o


Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Bhargav Rao

3

Tôi không biết bất kỳ cơ sở dữ liệu nào hỗ trợ điều này (SQL Server, MySQL, Oracle, PostgreQuery). Nó chắc chắn không phải là một phần của các tiêu chuẩn SQL, vì vậy tôi nghĩ rằng bạn phải chỉ định các cột bạn muốn.

Tất nhiên bạn có thể xây dựng câu lệnh SQL của mình một cách linh hoạt và để máy chủ thực thi nó. Nhưng điều này mở ra khả năng tiêm SQL ..


3

Tôi biết điều này hơi cũ, nhưng tôi vừa gặp vấn đề tương tự và đang tìm kiếm một câu trả lời. Sau đó, tôi đã có một nhà phát triển cao cấp chỉ cho tôi một mẹo rất đơn giản.

Nếu bạn đang sử dụng trình soạn thảo truy vấn của studio quản lý, hãy mở rộng cơ sở dữ liệu, sau đó mở rộng bảng mà bạn đang chọn để có thể xem thư mục cột.

Trong câu lệnh chọn của bạn, chỉ cần tô sáng thư mục cột được tham chiếu ở trên và kéo và thả nó vào cửa sổ truy vấn. Nó sẽ dán tất cả các cột của bảng, sau đó chỉ cần xóa cột định danh khỏi danh sách các cột ...


1
Có, nhưng nếu bạn có 5 lần tham gia, ý tưởng sẽ được thực hiệnSELECT * Except(tableName.ColumnName) FROM ...
Pawel Cioch

Tôi thấy điều này hữu ích :) Tôi chưa biết về điều đó, tuy nhiên đây không phải là câu trả lời cho câu hỏi chủ đề.
Fka

3

Cách tốt nhất để giải quyết vấn đề này là sử dụng chế độ xem, bạn có thể tạo chế độ xem với các cột bắt buộc và truy xuất dữ liệu dưới dạng

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
Điều gì sẽ xảy ra nếu số lượng cột lớn, giả sử 100 & chúng tôi muốn CHỌN tất cả các cột, nhưng một cột. Có một cách tiếp cận tốt hơn?
KartikKannapur

5
Đây là một loại bỏ lỡ điểm. Bạn đang chọn "id, date" trong cuộc gọi thứ hai, nếu bạn định làm điều đó, chỉ cần thực hiện nó ở vị trí đầu tiên.
keithpjcar

3

Nếu bạn muốn loại trừ một cột trường hợp nhạy cảm như mật khẩu chẳng hạn, tôi làm điều này để ẩn giá trị:

SELECT * , "" as password FROM tableName;


cái này hiệu quả với tôi
Arun Prasad ES

1
Trong khi bạn tất nhiên không bao giờ nên lưu trữ mật khẩu văn bản rõ ràng trong cơ sở dữ liệu của bạn. Ít nhất là họ nên được băm với muối và hạt tiêu có lẽ security.stackexchange.com/questions/3272/...
Anders_K

2

Vâng, đó là một thực tiễn tốt nhất phổ biến để chỉ định cột nào bạn muốn, thay vì chỉ xác định *. Vì vậy, bạn chỉ nên nói những lĩnh vực bạn muốn lựa chọn của bạn trở lại.


2

Một colleage khuyên một lựa chọn tốt:

  • HÃY CHỌN VÀO trong truy vấn trước của bạn (nơi bạn tạo hoặc lấy dữ liệu từ đó) vào một bảng (mà bạn sẽ xóa khi hoàn tất). Điều này sẽ tạo ra cấu trúc cho bạn.
  • Thực hiện một kịch bản như TẠO sang cửa sổ truy vấn mới.
  • Loại bỏ các cột không mong muốn. Định dạng các cột còn lại thành 1 lớp lót và dán vào danh sách cột của bạn.
  • Xóa bảng bạn đã tạo.

Làm xong...

Điều này đã giúp chúng tôi rất nhiều.


1

Bảng nhấp chuột phải vào Object Explorer, Chọn 1000 hàng trên cùng

Nó sẽ liệt kê tất cả các cột và không *. Sau đó loại bỏ (các) cột không mong muốn. Nên nhanh hơn nhiều so với tự gõ nó.

Sau đó, khi bạn cảm thấy việc này hơi quá, hãy lấy Dấu nhắc SQL của Red Gate và nhập ssf từ tbl, chuyển đến tab * và nhấp lại vào tab.


1

Đó là những gì tôi sử dụng thường xuyên cho trường hợp này:

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 giống như column1,column2,column5


1

Đôi khi cùng một chương trình phải xử lý các quy tắc cơ sở dữ liệu khác nhau. Vì vậy, tôi không thể sử dụng danh sách cột trong chương trình để tránh lỗi trongselect câu lệnh.

*cung cấp cho tôi tất cả các lĩnh vực tùy chọn. Tôi kiểm tra nếu các trường tồn tại trong bảng dữ liệu trước khi sử dụng. Đây là lý do của tôi để sử dụng *trongselect .

Đây là cách tôi xử lý các trường bị loại trừ:

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

Xem xét xây dựng / làm rõ câu hỏi / vấn đề của bạn.
badfilms 1/10/2015

1

Tôi biết câu hỏi này đã cũ, nhưng tôi hy vọng câu hỏi này vẫn có thể hữu ích. Câu trả lời được lấy cảm hứng từ một cuộc thảo luận từ Diễn đàn SQL Server . Bạn có thể làm điều này một thủ tục lưu trữ . Nó cũng có thể được sửa đổi để thêm nhiều hơn một trường trừ các trường.

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

Sẽ không đơn giản hơn để làm điều này:

sp_help <table_name>

-Nhấp vào cột 'Cột tên'> Sao chép> Dán (tạo danh sách dọc) vào cửa sổ Truy vấn mới và chỉ cần nhập dấu phẩy trước mỗi giá trị cột ... nhận xét các cột bạn không muốn ... ít hơn nhiều gõ hơn bất kỳ mã nào được cung cấp ở đây và vẫn có thể quản lý được.


"gõ ít hơn nhiều so với bất kỳ mã nào được cung cấp ở đây" và rắc rối hơn nhiều so với việc kéo nút Cột vào trình chỉnh sửa truy vấn hoặc bất kỳ cách nào khác để nhận danh sách. Ý tôi là những gì về bảng có nhiều cột 10?
gạch dưới

0

Bạn có thể nhận SQL Complete từ devart.com, nó không chỉ mở rộng * ký tự đại diện giống như SQL Prompt từ Red Gate (như được mô tả trong câu trả lời của cairnz), mà còn cung cấp trình chọn cột thả xuống với các hộp kiểm trong đó bạn có thể kiểm tra tất cả các cột mà bạn muốn trong danh sách chọn và chúng sẽ được chèn tự động cho bạn (và nếu sau đó bạn bỏ chọn một cột thì nó sẽ tự động bị xóa khỏi danh sách chọn).


0

Trong SSMS có một cách dễ dàng hơn với IntelliSenseAliasing . Thử cái này

  1. Nhấp chuột phải vào trình soạn thảo văn bản và đảm bảo IntelliSense được bật.
  2. Nhập truy vấn bằng bí danh [CHỌN t. * TỪ tablename t].
  3. Chuyển văn bản t. * Và xóa * và SSMS sẽ tự động liệt kê các cột của bảng bí danh f .
Sau đó, bạn có thể nhanh chóng chỉ định các cột bạn muốn sử dụng SSMS để viết phần chọn vào tập lệnh khác và sau đó thực hiện thêm thao tác sao chép / dán. Tôi sử dụng tất cả các thời gian.


Bạn có thể chỉ định câu trả lời của bạn để loại trừ cột không?
Kamiccolo

@Kamiccolo - những gì đang được DuckWork mô tả là một hành động HƯỚNG DẪN. Cắt và dán tên cột mong muốn. Anh ta chỉ đơn thuần nói đây là một cách để dễ dàng lấy tên hơn mà không cần gõ nhiều. Nó không giúp bạn viết một truy vấn có nội dung "loại trừ cột này". Nó chỉ giúp bạn tạo danh sách các cột mong muốn, sau đó bạn dán vào truy vấn của mình.
ToolmakerSteve
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.