【问题标题】:Selecting specific fields from a table with SELECT *使用 SELECT * 从表中选择特定字段
【发布时间】:2017-04-06 08:12:56
【问题描述】:

我有两个表 - 我希望能够从 tbl1 中选择数据并将其插入到 tbl2 中。现在这是交易 - Tbl1 大约有 30 个字段。该表中有三列不在 tbl2 中。我没有单独指定每个字段,而是试图看看我是否有任何可能的方法来做这样的事情......

Insert into Tbl2 SELECT * (but three fields) from tbl1 where value='value'

或者做类似的事情

Insert Into tbl2 SELECT Field1, Field2 

但是因为我将在每种情况下为许多不同的表执行此操作,所以 tbl1 将有 3 个额外的字段,然后是相应的 tb2 - 我正在尝试以尽可能简单和最干净的方式进行操作

有什么建议吗?

【问题讨论】:

  • 为什么所有这些列,以及为什么要移动数据?
  • @jarlh 需要给用户一个选项来撤消他们以前做过的事情-
  • 如果你想做正确的,指定列!
  • 您应该始终指定您的列。如果您想保存一些输入,您可以将列“文件夹”从 SSMS 拖到查询窗口,它会将所有列名带入您的查询中。然后只需删除您不想要的三列。
  • 在对象资源管理器中右键单击源表-单击select top N rows,删除您不想要的3列,复制并粘贴。完成。

标签: sql sql-server select insert


【解决方案1】:

这是做不到的,没有语法可以插入或选择“所有字段除外”。

如果有的话,使用它是个坏主意,原因与应用程序代码中的select * 是个坏主意完全相同。 (假设表定义永远不会改变,并且您总是需要所有数据。)

【讨论】:

    【解决方案2】:

    你想这样做吗?

    例子:

    INSERT INTO Customers (CustomerName, Country)
    SELECT SupplierName, Country FROM Suppliers
    WHERE Country='Germany';
    

    【讨论】:

    • 嗯,是的,但我已经知道如何做到这一点,试图找到一种不指定每个字段的方法
    【解决方案3】:
     declare @sql as nvarchar(2000)
     declare @columns as nvarchar(1000) = ''
     select @columns = @columns + '[' + c.name + '], ' 
     from syscolumns c join sysobjects o on c.id=o.id 
     where o.name = 'tbl1' and c.name not in ('col1name', 'col2name', 
     'col3name')
     set @columns = left(@columns,len(@columns)-2)
     set @sql = N'Insert Into tbl2 (' + @columns + ') values (' + @columns + ')'
     exec(@sql)
    

    col1name..col3name 是你想错过的列

    【讨论】:

    • 谢谢 - 我并不想太疯狂 - 我只是指定所有字段并暂时保留它。 !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    相关资源
    最近更新 更多