【问题标题】:Select all columns except some columns [duplicate]选择除某些列之外的所有列[重复]
【发布时间】:2013-12-19 21:39:41
【问题描述】:

我的表中有大量列,例如 20-30。我想选择除 3-4 列之外的所有列。有没有办法SELECT * EVERYTHING BUT COLUMNS (Address,Name etc...) FROM MyTable 如果没有,那么这样的功能会有用吗?

【问题讨论】:

标签: sql sql-server sql-server-2005


【解决方案1】:

在 SSMS 中,打开对象资源管理器,右键单击表 -> “将表编写为” -> “选择到” -> “新建查询编辑器窗口”

删除不需要的列并运行查询。它会为您完成所有的打字工作。

【讨论】:

  • 我知道这一点,我想这是在不改变数据库的情况下做我想做的事情的唯一简单方法。我想我也可以选择前 1000 名并删除我不需要的东西。
【解决方案2】:

--只需更改表名并放入 NOT IN 列

   DECLARE @cols AS NVARCHAR(MAX),   @query  AS NVARCHAR(MAX)
   select @cols = STUFF((SELECT  N',' + QUOTENAME(c.name) 
   FROM sys.tables AS t
   INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID
   WHERE t.name = 'tagCloudLibrary'
   and c.name not in ('langID')

        FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)')  ,1,1,'')


 set @query = N'SELECT ' + @cols + N' from tagCloudLibrary'
     execute sp_executesql @query;

【讨论】:

  • +1 有两个注释:而不是WHERE t.name = 'tagCloudLibrary' 我会使用WHERE {t|c}.object_id = OBJECT_ID(N'dbo.tagCloudLibrary') ...和... from dbo.tagCloudLibrary
  • @Bogdan 我实际上不会使用OBJECT_ID - it doesn't observe outer isolation semantics 并且也使得跨数据库重用这些类型的查询变得更加困难。改为加入sys.schemas
  • @AaronBertrand 感谢您提供此 Connect 项目。 OBJECT_ID 不是一件容易的事,因为它可能使用 DB 名称 (SELECT OBJECT(N'DB1.dbo.Table1')) 调用,并且当前会话可能有另一个 DB 处于活动状态(例如:DB2;USE DB2; SELECT OBJECT(N'DB1.dbo.Table1')) + 这些 DB 可能有不同的隔离/快照隔离设置(DB1: RCSI & DB2/current session:SI). 在这些场景中 OBJECT_ID 应该怎么做?
  • @Bogdan 就像我说的那样,不是依靠 OBJECT_ID() function 通过模式 + 表来识别对象,而是加入 sys.schemas。
  • 就我个人而言,我永远不会使用嵌入式 SQL 的方法来完成这样的任务......我没有低估为什么会有这样的问题来推销自己?但对我来说,回答只是为了让自己保持体形,写一些代码……
【解决方案3】:

最好只在该表上创建一个 VIEW,不包含您不想看到的列。然后您可以从 VIEW 中选择 *。

【讨论】:

    猜你喜欢
    • 2015-10-18
    • 2016-03-07
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2018-02-01
    • 1970-01-01
    相关资源
    最近更新 更多