2009-09-03 18 views
1

可以說我有兩個表我該怎麼辦多次插入無光標

TBLA( tableAID INT IDENTITY(1,1), FOO VARCHAR(100))

TBLB( tableBID INTIDENTITY (1,1), tableAID INT, bar varchar(100))

tblB.tableAID是FK到tblA。

我想插入一堆記錄(從系統中的其他表中拉出)到這對錶中。我需要知道在插入tblB之前插入tblA的ID是什麼。

有沒有辦法做到這一點,而不是逐行處理?

回答

3

在SQL Server 2005及更高版本,可以使用OUTPUT子句來新鍵值傳遞到第二個表:

INSERT INTO T ... 
OUTPUT PrimaryKeycol, otherValues INTO ChildTable; 

其他possibilies中存在帶有「可組合DML」和MERGE語句的SQL Server 2008。

新增迴應評論:

create table T(i int identity(1,1), j int, k int default -1); 
go 

merge into T using (values (1), (2)) as U(j) 
on U.j = T.j 
when not matched then insert (j) values (j) 
output inserted.i, inserted.k; 
go 

drop table T; 
+0

這是最接近我正在尋找。唯一的缺點是OUTPUT子句只能訪問目標表中指定的列,這是一種雞與雞蛋的問題 - 如果我有一些獨特的東西插入到目標表中,我可以加入目標表獲取插入的ID。不過,我接受你的答案,因爲它教會了我一些新的東西。 – stannius 2009-09-09 15:54:39

+2

提示:如果使用MERGE而不是INSERT,則可以在OUTPUT子句中包含未提及的列。我會給我的答案添加一個例子。 – 2009-09-10 00:32:13

0

你可以使用臨時表嗎?

DECLARE @t TABLE (foo, int, ba VARCHAR(50)) 
INSERT INTO @t (foo, bar) SELECT foo, bar FROM your_other_table 
ALTER TABLE @t ADD id_a INT IDENTITY(1, 1) 

您應該使用SET IDENTITY_INSERT OFF做到這一點

也許你會想你的reseed表做一個適當的插入,而該表是在生產。

DBCC CHECKIDENT 'tblA' RESEED, newValue 
+0

目標表中已經有數據,所以我必須從那裏獲取標識值。系統也會運行,所以我不能做MAX(id)+1。 – stannius 2009-09-09 14:59:36

+0

我只是把更多的信息.​​..解釋RESEED的東西......也許它可以對你有用 – 2009-09-09 16:09:43

0

假設你真正問的是如何避免多次往返到服務器,然後一個辦法是寫一個存儲過程,做兩個插入,之後使用

Set @Pk = Scope_Identity() 

第一次插入以獲取爲第一次插入創建的Identity值,然後將第二次插入使用該@Pk值。

這裏有一個簡單的例子

Create Procedure SaveEmployee 
@Name varChar(30), 
@DivId Int, 
@HomePhoneNumber VarChar(12), 
@FaxNumber VarChar(12) 
As 
Set NoCount On 
Declare @Pk Integer 


    Insert Employees(Name, Divisionid) 
    Values(@Name, @DivId) 
    Set @Pk = Scope_Identity() 
    -- ------------------------------------------------ 
    Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber) 
    Values(@Pk, 'Home', @HomePhoneNumber) 
    -- ------------------------------------------------ 
    Insert PhoneNums(EmployeeId, PhoneType, PhoneNumber) 
    Values(@Pk, 'Fax', @FaxNumber) 

    Return 1 
+0

實際上,腳本運行在服務器上。我試圖避免的是一個遊標。 – stannius 2009-09-09 14:57:50

0

這也可能是過去它是非常有用的地步,但是這指出了使用代理主鍵的固有的困難,特別是與使用它們作爲外鍵其他表格。如果您的關係是使用自然鍵定義的,則您從一開始就知道要插入的值。

+0

我沒有定義模式,那些對模式有控制權的人在代理鍵陣營中。無論如何,我不確定什麼天然關鍵字適合所討論的表格 - 唯一可能的候選用戶標識+標題,但實際上並沒有一個業務規則,標題必須是唯一的,並且可能是基於業務約束數據庫規則,而不是相反,對嗎? – stannius 2009-09-09 15:11:41