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

SELECT * FROM tableA

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

SELECT * [except columnA] FROM tableA

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


当前回答

如果您正在使用SQL Server Management Studio,那么请执行以下操作:

输入所需的表名并选择它 按Alt + F1 O /p表示表中的列。 选择所需的列 复制并粘贴这些在您的选择查询 触发查询。

享受。

其他回答

我不知道有任何数据库支持这个(SQL Server, MySQL, Oracle, PostgreSQL)。它绝对不是SQL标准的一部分,所以我认为你必须只指定你想要的列。

当然,您可以动态地构建SQL语句并让服务器执行它。但是这为SQL注入打开了可能性。

DECLARE @Columns NVARCHAR(MAX)='',@SQL NVARCHAR(MAX)
SELECT @Columns=CASE WHEN @Columns='' THEN name ELSE @Columns+','+name END  
FROM sys.columns 
WHERE object_ID=(sELECT id FROM sysobjects WHERE name='TheTableName') and NAME!='WithoutColumnName'

SELECT @SQL='SELECT '+@Columns+' FROM dbo.TheTableName'
EXEC sp_execute @SQL

No.

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

至少有两个原因:

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

编辑(2011年7月):

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

您可以使用REGEX列规范。

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

这是我在这个例子中经常用到的

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看起来像column1,column2,column5