2013-07-20 35 views
1

我有3個數據表來更新數據庫插入許多安託數從數據表數據庫

  • Invoice表,主鍵是InvoiceNo
  • InvoiceProduct表,主鍵是InvoiceProductNo和外鍵InvoiceNo
  • InvoiceProductExp表主鍵是InvoiceProductExpNo和外鍵是InvoiceNoInvoiceProductNo

事實:

  • 一個InvoiceNo有許多InvoiceProductNo
  • 一個InvoiceProductNo有許多InvoiceProductExpNo

3數據表數據項將是例如被

Invoice (InvoiceNo,...) 
(0001,...) 

InvoiceProduct (InvoiceProductNo, InvoiceNo) 
(1,0001,...) 
(2,0001,...) 

InvoiceProductExp (InvoiceProductExpNo,InvoiceProductNo,InvoiceNo) 
(1,1,0001,...) 
(2,1,0001,...) 
(3,2,0001,...) 
(4,2,0001,...) 

的問題是我喜歡用SQL Server生成Identity colu mn 3個表的所有主鍵

我該如何準備insert陳述?

Insert Into InvoiceProductExp values (auto_number, ?, ?) 

我怎樣才能得到InvoiceProductNo因爲InvoiceProductNo插入到InvoiceProductExp表自動編號?

回答

0

如果您的主鍵是標識列類型,那麼您不必將值插入到主鍵列中。當行被提交到數據庫時,標識列將自動填充。

這是否解決您的問題?

+0

請仔細閱讀 – deva

0

爲什麼要手動?您可以將您的ID設置爲自動自動增量。 當您創建表:

UserID INT IDENTITY(1,1) NOT NULL

樣品(創建表)

CREATE TABLE dbo.Tool(
    UserID INT IDENTITY NOT NULL PRIMARY KEY, 
    Name VARCHAR(40) NOT NULL 
) 

插入值

INSERT INTO dbo.Tool(Name) VALUES ('Person 1') 
INSERT INTO dbo.Tool(Name) VALUES ('Person 2') 
+0

我感謝您的回覆 請仔細閱讀 – deva

3

您正在尋找SCOPE_IDENTITY()

DECLARE @InvoiceNo INT 
DECLARE @InvoiceProductNo INT 

INSERT INTO Invoice ([Date]) 
VALUES (GETDATE()) 

SELECT @InvoiceNo = SCOPE_IDENTITY() 

INSERT INTO InvoiceProduct([InvoiceNo]) 
VALUES (@InvoiceNo) 

SELECT @InvoiceProductNo = SCOPE_IDENTITY() 

INSERT INTO InvoiceProductExp ([InvoiceProductNo], [InvoiceNo]) 
VALUES (@InvoiceProductNo, @InvoiceNo) 

這裏是SQLFiddle演示

+0

謝謝 做SQL服務器2008支持SCOPE_IDENTITY?它不返回任何內容,但是@@ IDENTITY有效,但@@ IDENTITY不可靠 – deva

+1

@deva不客氣。當然可以。答案爲您提供了一個SQL Server 2008文檔的鏈接,而sqlfiddle也是2008.現在您的'SCOPE_IDENTITY()'問題肯定是由於您將其稱爲超出插入範圍的範圍而引起的。 *** SCOPE_IDENTITY()返回插入到同一範圍內的標識列中的最後一個標識值。**範圍是一個模塊:存儲過程,觸發器,函數或批處理。因此,如果兩個語句處於相同的存儲過程,函數或批處理中,則它們處於相同的範圍。* – peterm

+0

@deva它有幫助嗎? – peterm