2013-07-20 33 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