T-SQL插入到表中,無需指定每一列。

[英]T-SQL Insert into table without having to specify every column


In our db there is a table that has a little over 80 columns. It has a primary key and Identity insert is turned on. I'm looking for a way to insert into this table every column EXCEPT the primary key column from an identical table in a different DB.

在我們的db中,有一個表有超過80列。它有一個主鍵,身份插入被打開。我正在尋找一種方法,將除主鍵列之外的所有列插入到這個表中。主鍵列來自同一個表,位於不同的DB中。

Is this possible?

這是可能的嗎?

7 个解决方案

#1


42  

You can do this quite easily actually:

其實這很容易做到:

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

Provided you have Identity Insert On in "YourOtherBigTable" and columns are absolutely identical you will be okay.

如果您在“YourOtherBigTable”中有身份插入,並且列是完全相同的,那么您將不會有問題。

#2


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

This works in SQL2012

這在SQL2012工作

#3


2  

You could query Information_Schema to get a list of all the columns and programatically generate the column names for your query. If you're doing this all in t-sql it would be cumbersome, but it could be done. If you're using some other client language, like C# to do the operation, it would be a little less cumbersome.

您可以查詢Information_Schema獲取所有列的列表,並按程序生成查詢的列名。如果您在t-sql中執行所有這些操作,將會非常麻煩,但是可以這樣做。如果您正在使用其他的客戶端語言,比如c#來執行操作,那么它就不會那么麻煩了。

#4


2  

No, that's not possible. You could be tempted to use

不,那是不可能的。你可能會被誘惑使用

INSERT INTO MyLargeTable SELECT * FROM OtherTable

But that would not work, because your identity column would be included in the *.

但這不會起作用,因為你的身份列將被包含在*中。

You could use

您可以使用

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

first you enable inserting identity values, than you copy the records, then you enable the identity column again.

首先啟用插入標識值,而不是復制記錄,然后再次啟用標識列。

But this won't work neither. SQL server won't accept the * in this case. You have to explicitly include the Id in the script, like :

但這也不會起作用。在這種情況下,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

So we're back from where we started.

我們從開始的地方回來了。

The easiest way is to right click the table in Management Studio, let it generate the INSERT and SELECT scripts, and edit them a little to let them work together.

最簡單的方法是在Management Studio中右鍵單擊該表,讓它生成插入和選擇腳本,並對它們進行一些編輯,讓它們一起工作。

#5


1  

Why not just create a VIEW of the original data, removing the unwanted fields? Then 'Select * into' your hearts desire.

為什么不創建原始數據的視圖,刪除不需要的字段呢?然后“選擇”進入你內心的渴望。

  • Localized control within a single view
  • 在單個視圖中本地化控件
  • No need to modify SPROC
  • 無需修改SPROC
  • Add/change/delete fields easy
  • 添加/更改/刪除字段容易
  • No need to query meta-data
  • 不需要查詢元數據
  • No temporary tables
  • 沒有臨時表

#6


0  

Really, honestly it takes ten seconds or less to pull all of the columns over from the object browser and then delete the identity column from the list. It is a bad idea to use select * for anything but quick ad hoc query.

實際上,從對象瀏覽器中拖出所有列並從列表中刪除標識列需要10秒或更短的時間。除了快速的臨時查詢外,使用select *是一個壞主意。

#7


-1  

In answer to a related question (SELECT * EXCEPT), I point out the truly relational language Tutorial D allows projection to be expressed in terms of the attributes to be removed instead of the ones to be kept e.g.

在回答一個相關的問題(SELECT * EXCEPT)時,我指出真正的關系語言教程D允許根據要刪除的屬性而不是要保留的屬性來表達投影。

my_relvar { ALL BUT description }

However its INSERT syntax requires tuple value constructors to include attribute name / value pairs e.g.

但是,它的插入語法要求元組值構造函數包含屬性名/值對,例如。

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

Of course, using this syntax there is no column ordering (because it is truly relational!) e.g. this is semantically equivalent:

當然,使用這種語法沒有列排序(因為它是真正的關系!)

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

The alternative would be to rely fully on attribute ordering, which SQL does partially e.g. this is a close SQL equivalent to the the above:

另一種方法是完全依賴於屬性排序,這是SQL的一部分,這是與上面的SQL等價的:

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

Once the commalist of columns has been specified the VALUES row constructors have the maintain this order, which is not ideal. But at least the order is specified: your proposal would rely on some default order which may be possibly non-deterministic.

一旦指定了列的逗號,值行構造函數就保持了這個順序,這不是理想的。但至少順序是指定的:您的提議將依賴於一些可能不確定的默認順序。


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2012/03/05/7255771748e3a05743ffee38afe1e95a.html



 
粤ICP备14056181号  © 2014-2021 ITdaan.com