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

SELECT * FROM tableA

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

SELECT * [except columnA] FROM tableA

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


当前回答

如果你不想手动写每个列名,你可以使用Script Table As在SSMS中的表或视图中右键单击:

然后你会在新建查询编辑器窗口中得到整个选择查询,然后像这样删除不需要的列:

Done

其他回答

试试这个…

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

如果你使用的是PHP,你只需要查询,然后你可以取消设置一个特定的元素:

$sql = "SELECT * FROM ........ your query";
    $result = $conection->query($sql); // execute your query
    $row_cnt = $result->num_rows;   

if ($row_cnt > 0) {
        while ($row = $result->fetch_object()) {
            unset($row->your_column_name); // Exclude column from your fetch
            $data[] = $row;
}
echo json_encode($data); // or whatever

在SQL (SQL Server)中自动做到这一点的方法是:

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

基本上,你不能做你想做的事情,但你可以得到正确的工具来帮助你,让事情变得更容易一些。

如果你看一下Red-Gate的SQL提示,你可以输入“SELECT * FROM MyTable”,然后把光标移到“*”后面,然后点击<TAB>来展开字段列表,并删除那些你不需要的字段。

这不是一个完美的解决方案——但却是一个非常好的解决方案!:-)太糟糕了MS SQL Server Management Studio的智能感知仍然不够智能,无法提供此功能.......

Marc

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