【问题标题】:Insert with many Anto Number from Data Table to DataBase从数据表中插入多个安托数到数据库
【发布时间】:2013-07-19 11:13:36
【问题描述】:

我有 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 列作为 3 个表的所有主键

我该如何准备insert 声明?

Insert Into InvoiceProductExp values (auto_number, ?, ?)

由于InvoiceProductNo 是自动编号,如何让InvoiceProductNo 插入InvoiceProductExp 表?

【问题讨论】:

    标签: sql database ado.net datatable


    【解决方案1】:

    如果您的主键是标识列类型,那么您不必在主键列中插入值。当行提交到数据库时,标识列将自动填充。

    这能解决您的问题吗?

    【讨论】:

      【解决方案2】:

      为什么一定要手动?您可以将 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')
      

      【讨论】:

        【解决方案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演示

        【讨论】:

        • 谢谢 sql sever 2008 支持 SCOPE_IDENTITY 吗?它不返回任何东西,但 @@IDENTITY 有效,但 @@IDENTITY 不可靠
        • @deva 不客气。当然可以。答案为您提供了 SQL Server 2008 文档的链接,并且 sqlfiddle 也是 2008。现在,SCOPE_IDENTITY() 的问题肯定是由于您将其调用超出了已发出 insert 的范围。 SCOPE_IDENTITY() 返回插入到同一范围内的标识列中的最后一个标识值。 范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,则它们属于同一范围。
        • 感谢您的回复,Scope_Identity() 有效,我有 3 个表,我正在使用 dataAdapter 一个 InvoiceNo 有很多 InvoiceProductNo For InvoiceNo
        • 感谢您的回复,Scope_Identity() 有效,但我有 3 个表,我正在使用 dataAdapter 一个 InvoiceNo 有很多 InvoiceProductNo 例如 InvoiceNo 001 可以有 InvoiceProductNo 1 和 2 的值如何解决这个问题插入语句?
        猜你喜欢
        • 2017-06-07
        • 1970-01-01
        • 2013-05-21
        • 2018-10-03
        • 2015-03-31
        • 2014-06-08
        • 2018-09-27
        • 1970-01-01
        • 2011-09-20
        相关资源
        最近更新 更多