T-SQL插入表中而不必指定每一列

时间:2012-03-05 20:38:56

标签: sql sql-server-2008 tsql ssms

在我们的数据库中,有一个表有80多个列。它有一个主键,并打开标识插入。我正在寻找一种方法,在每个列中插入 EXCEPT 来自不同数据库中相同表的主键列。

这可能吗?

7 个答案:

答案 0 :(得分:49)

你可以很容易地做到这一点:

-- Select everything into temp table
Select * Into 
    #tmpBigTable
    From [YourBigTable]

-- Drop the Primary Key Column from the temp table  
Alter Table #tmpBigTable Drop Column [PrimaryKeyColumn]

-- Insert that into your other big table
Insert Into [YourOtherBigTable]
    Select * From #tmpBigTable

-- Drop the temp table you created
Drop Table #tmpBigTable

如果你在“YourOtherBigTable”中有Identity Insert On并且列完全相同,那么你就可以了。

答案 1 :(得分:3)

CREATE TABLE Tests
(
    TestID int IDENTITY PRIMARY KEY,
    A int,
    B int,
    C int
)

INSERT INTO dbo.Tests
VALUES (1,2,3)

SELECT * FROM Tests

这适用于SQL2012

答案 2 :(得分:2)

您可以查询Information_Schema以获取所有列的列表,并以编程方式生成查询的列名称。如果你在t-sql中做这一切都会很麻烦,但是可以做到。如果你正在使用其他一些客户端语言,比如C#来进行操作,那就不那么麻烦了。

答案 3 :(得分:2)

不,那是不可能的。你可能想要使用

INSERT INTO MyLargeTable SELECT * FROM OtherTable

但这不起作用,因为您的标识列将包含在*。

您可以使用

SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable SELECT * FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF

首先启用插入标识值,而不是复制记录,然后再次启用标识列。

但这也不会奏效。在这种情况下,SQL Server不接受*。您必须在脚本中明确包含Id,例如:

SET IDENTITY_INSERT MyLargeTable ON
INSERT INTO MyLargeTable (Id, co1, col2, ...., col80) SELECT Id, co1, col2, ...., col80 FROM OtherTable
SET IDENTITY_INSERT MyLargeTable OFF

所以我们从我们开始的地方回来了。

最简单的方法是右键单击Management Studio中的表,让它生成INSERT和SELECT脚本,然后稍微编辑它们以使它们一起工作。

答案 4 :(得分:1)

为什么不创建原始数据的VIEW,删除不需要的字段? 然后选择*进入'你的心愿。

  • 单一视图中的本地化控制
  • 无需修改SPROC
  • 轻松添加/更改/删除字段
  • 无需查询元数据
  • 没有临时表

答案 5 :(得分:0)

真的,老实说,从对象浏览器中提取所有列需要十秒或更短时间,然后从列表中删除标识列。除了快速的即席查询之外,使用select *进行任何操作都是一个坏主意。

答案 6 :(得分:-1)

在回答相关问题(SELECT * EXCEPT)时,我指出真正的关系语言Tutorial D允许以要删除的属性而不是要保留的属性来表示投影。

my_relvar { ALL BUT description }

然而,其INSERT语法要求元组值构造函数包含属性名称/值对,例如

INSERT P
   RELATION 
   {
      TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) }, 
      TUPLE { PNO PNO ( 'P2' ) , PNAME CHARACTER ( 'Bolt' ) }
   };

当然,使用这种语法没有列排序(因为它是真正的关系!),例如这在语义上是等价的:

INSERT P
   RELATION 
   {
      TUPLE { PNO PNO ( 'P1' ) , PNAME CHARACTER ( 'Nut' ) }, 
      TUPLE { PNAME CHARACTER ( 'Bolt' ) , PNO PNO ( 'P2' ) }
   };

另一种选择是完全依赖属性排序,而SQL则部分地依赖于属性排序。这是一个与上述相近的SQL:

INSERT INTO P ( PNO , PNAME ) 
   VALUES        
      ( PNO ( 'P1' ) , CAST ( 'Nut'  AS VARCHAR ( 20 ) ) ) , 
      ( PNO ( 'P2' ) , CAST ( 'Bolt' AS VARCHAR ( 20 ) ) );

一旦指定了列的commalist,VALUES行构造函数就会维护此顺序,这是不理想的。但至少指定了订单:您的提案将依赖于某些默认订单,这可能是非确定性的。