簡體   English   中英

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

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

在我們的數據庫中,有一個表有80多個列。 它有一個主鍵,並打開標識插入。 我正在尋找一種方法來插入此表中的每一列除了來自不同數據庫中相同表的主鍵列之外。

這可能嗎?

你可以很容易地做到這一點:

-- 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並且列完全相同,那么您將沒問題。

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

您可以查詢Information_Schema以獲取所有列的列表,並以編程方式生成查詢的列名稱。 如果你在t-sql中做這一切都會很麻煩,但是可以做到。 如果你正在使用其他一些客戶端語言,比如C#來進行操作,那就不那么麻煩了。

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

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腳本,然后稍微編輯它們以使它們一起工作。

為什么不創建原始數據的VIEW,刪除不需要的字段? 然后'選擇*進入'你的心願。

  • 單個視圖中的本地化控制
  • 無需修改SPROC
  • 輕松添加/更改/刪除字段
  • 無需查詢元數據
  • 沒有臨時表

說實話,從對象瀏覽器中拉出所有列需要十秒或更短時間,然后從列表中刪除標識列。 除了快速的即席查詢之外,使用select *進行任何操作都是一個壞主意。

在回答相關問題( 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行構造函數就會維護此順序,這並不理想。 但至少指定了訂單:您的提案將依賴於某些默認訂單,這可能是非確定性的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM