可以說我有兩個表我該怎麼辦多次插入無光標
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是什麼。
有沒有辦法做到這一點,而不是逐行處理?
可以說我有兩個表我該怎麼辦多次插入無光標
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是什麼。
有沒有辦法做到這一點,而不是逐行處理?
在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;
你可以使用臨時表嗎?
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
目標表中已經有數據,所以我必須從那裏獲取標識值。系統也會運行,所以我不能做MAX(id)+1。 – stannius 2009-09-09 14:59:36
我只是把更多的信息...解釋RESEED的東西......也許它可以對你有用 – 2009-09-09 16:09:43
假設你真正問的是如何避免多次往返到服務器,然後一個辦法是寫一個存儲過程,做兩個插入,之後使用
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
實際上,腳本運行在服務器上。我試圖避免的是一個遊標。 – stannius 2009-09-09 14:57:50
這也可能是過去它是非常有用的地步,但是這指出了使用代理主鍵的固有的困難,特別是與使用它們作爲外鍵其他表格。如果您的關係是使用自然鍵定義的,則您從一開始就知道要插入的值。
我沒有定義模式,那些對模式有控制權的人在代理鍵陣營中。無論如何,我不確定什麼天然關鍵字適合所討論的表格 - 唯一可能的候選用戶標識+標題,但實際上並沒有一個業務規則,標題必須是唯一的,並且可能是基於業務約束數據庫規則,而不是相反,對嗎? – stannius 2009-09-09 15:11:41
這是最接近我正在尋找。唯一的缺點是OUTPUT子句只能訪問目標表中指定的列,這是一種雞與雞蛋的問題 - 如果我有一些獨特的東西插入到目標表中,我可以加入目標表獲取插入的ID。不過,我接受你的答案,因爲它教會了我一些新的東西。 – stannius 2009-09-09 15:54:39
提示:如果使用MERGE而不是INSERT,則可以在OUTPUT子句中包含未提及的列。我會給我的答案添加一個例子。 – 2009-09-10 00:32:13