我们都知道,要从表中选择所有列,可以使用

SELECT * FROM tableA

是否有一种方法可以在不指定所有列的情况下从表中排除列?

SELECT * [except columnA] FROM tableA

我所知道的唯一方法是手动指定所有列并排除不需要的列。这真的很耗时,所以我正在寻找方法来节省时间和精力,以及未来的维护表应该有更多/更少的列。


当前回答

如果您有许多列,而您只想排除其中一列。您可以使用下面的命令 从表中选择* exclude(列名)

其他回答

一位同事提出了一个不错的替代方案:

在前面的查询中执行SELECT INTO(在哪里生成或获取? 数据从)到一个表(你将删除时完成)。这将 为你创建结构。 做一个脚本创建到新的查询 窗口。 删除不需要的列。格式化剩下的列 成1的内衬,并粘贴为您的列列表。 删除表 创建。

做……

这对我们帮助很大。

您可以使用REGEX列规范。

下面的查询选择除ds和hr之外的所有列 选择(ds |人力资源)? +。+来自销售

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)

更新:

如果您经常使用这个任务,还可以创建一个存储过程来处理它。 在这个例子中,我使用了内置的STRING_SPLIT(),它在SQL Server 2016+上可用, 但如果你需要,有很多例子教你如何在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

然后就是:

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

No.

轻维护的最佳实践是只指定所需的列。

至少有两个原因:

这使得客户端和数据库之间的契约是稳定的。每次都是相同的数据 性能,涵盖指标

编辑(2011年7月):

如果您从对象资源管理器中拖动表的列节点,它会在查询窗口中为您放置一个CSV列列表,从而实现您的目标之一

右键单击对象资源管理器中的表,选择前1000行

它会列出所有列,而不是*。然后删除不需要的列。应该比你自己打快多了。

然后,当你觉得这有点太多的工作,获得Red Gate的SQL提示,并从tbl输入ssf,转到*并再次单击选项卡。