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

SELECT * FROM tableA

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

SELECT * [except columnA] FROM tableA

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


当前回答

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

其他回答

试试这个…

=QUERY(TRANSPOSE(QUERY('Data'!A1:AH,"SELECT * ",1)),"SELECT * WHERE Col1 <> 'Column 
 name'",1)

是的,这是可能的(但不建议)。

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

代码说明:

Declare a variable to store a comma separated list of column names. This defaults to NULL. Use a system view to determine the names of the columns in our table. Use SELECT @variable = @variable + ... FROM to concatenate the column names. This type of SELECT does not not return a result set. This is perhaps undocumented behaviour but works in every version of SQL Server. As an alternative you could use SET @variable = (SELECT ... FOR XML PATH('')) to concatenate strings. Use the ISNULL function to prepend a comma only if this is not the first column name. Use the QUOTENAME function to support spaces and punctuation in column names. Use the WHERE clause to hide columns we don't want to see. Use EXEC (@variable), also known as dynamic SQL, to resolve the column names at runtime. This is needed because we don't know the column names at compile time.

不,没有办法这样做,也没有很好的理由这样做。

在选择不应该使用*的数据时,应该始终指定所需的字段。原因是,即使稍后向表中添加另一个字段,您也希望查询能够正常工作。此外,您还可以指定结果中字段的顺序,以便重新排列表中的字段不会改变结果。

当然,这同样适用于*,除非有可能这样做。

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

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

做……

这对我们帮助很大。

我知道这有点过时了,但我也遇到过同样的问题,正在寻找答案。然后我让一个高级开发人员给我展示了一个非常简单的技巧。

如果使用management studio查询编辑器,请展开数据库,然后展开从中选择的表,以便可以看到列文件夹。

在选择语句中,只需突出显示上面引用的列文件夹,并将其拖放到查询窗口中。它将粘贴表的所有列,然后简单地从列列表中删除标识列…