【问题标题】:Insert multiple records using stored procedure使用存储过程插入多条记录
【发布时间】:2015-04-30 08:35:02
【问题描述】:

我有两张桌子

emplyoee (first table)
id primary key auto increment
emp_name varchar

student(second table)
id foriegnkey emplyoee.id
st_name varchar

我想为单个 employeeid 插入多个学生记录。我的代码附在此处,但这仅用于一个学生记录更新。我怎样才能为此需要编写存储过程。 我是 SQL Server 和存储过程的新手。

你能帮帮我吗?

create procedure  empst_Sp
@emp_name varchar(50),
@st_name varchar(50)
as
begin
insert into emplyoee (emp_name) values (@emp_name)
insert into student(id,st_name) values(SCOPE_IDENTITY(),@st_name)
end

【问题讨论】:

  • 多个学生记录是什么意思?对于这些多条记录,st_name 的值是多少?向我们展示您如何称呼 SP。
  • 是否可以添加一个主键使用插入多个外键

标签: sql asp.net sql-server sql-server-2008


【解决方案1】:

对于您的情况,您可以尝试上面的代码(我使用的是 XML 参数类型)

CREATE PROCEDURE EmployeeIns
  @EmployeeName NVARCHAR(50),
  @Students XML
AS
/*
  @Students : <Students>
                  <Student Name='Studen 1'/>
                  <Student Name='Studen 1'/>
              </Students>
*/
BEGIN
    DECLARE @StudenTable TABLE(Name NVARCHAR(50))
    DECLARE @EmployeeId INT

    INSERT INTO @StudenTable
    SELECT Tbl.Col.value('@Name', 'NVARCHAR(50)')
    FROM @Students.nodes('//Student') Tbl(Col)

    INSERT INTO Emplyoee VALUES(@EmployeeName)
    SET @EmployeeId = SCOPE_IDENTITY()

    INSERT INTO Student 
    SELECT @EmployeeId, Name FROM @StudenTable
END

更新 1: 您的表格设计应如下所示:

CREATE TABLE [dbo].[Emplyoee](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](150) NULL,
 CONSTRAINT [PK_Emplyoee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
))

CREATE TABLE [dbo].[Student](
    [EmployeeId] [int] NULL,
    [Name] [nvarchar](150) NULL,
    [Id] [int] IDENTITY(1,1) NOT NULL,
 CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
))

执行代码:

EXEC EmployeeIns @EmployeeName='trungtin1710', @Students = '<Students><Student Name="Studen 1"/><Student Name="Studen 1"/></Students>'

【讨论】:

  • 数据未传递到学生表
  • @UnniR 请检查更新 1,您应该更改 Student 表的架构
  • @UnniR 你应该在互联网上搜索,有很多关于这个的话题。例如:stackoverflow.com/questions/1260952/…
【解决方案2】:

您所需要的只是一个local variable,您可以在其中设置从 Scope_Identity 检索到的值:-

CREATE PROCEDURE empst_Sp
@emp_name varchar(50),
@st_name varchar(50)
AS
BEGIN
DECLARE @id INT
INSERT INTO emplyoee (emp_name) VALUES (@emp_name)
set @id = SCOPE_IDENTITY()
INSERT INTO student(id,st_name) VALUES (@id,@st_name)
END

【讨论】:

    【解决方案3】:

    据我了解: 如果@emp_name 的emplyoee 已经存在,则插入带有该emplyoee ID 的学生记录,如果没有任何带有@emp_name 的emplyoee,则需要插入新emplyoee 和带有新emplyoee ID 的学生。是吗?

    CREATE PROCEDURE empst_Sp
    @emp_name varchar(50),
    @st_name varchar(50)
    AS
    BEGIN    
        DECLARE @EmplyoeeId  int
        SET @EmplyoeeId = NULL
    
        select @EmplyoeeId = id 
        from   emplyoee 
        where  emp_name = @emp_name
    
        IF @EmplyoeeId IS NULL
        BEGIN
          insert into emplyoee (emp_name) values (@emp_name)
          SET @EmplyoeeId = SCOPE_IDENTITY()
        END
    
        insert into student(id, st_name) values(@EmplyoeeId, @st_name)
    END
    

    【讨论】:

    • 是的,相同的 id (Employee) 用于插入多个学生。
    • 好的,请试试这个代码。如果可以正常工作,代码需要重构以获得更漂亮的视图
    • 我想使用主键在学生表中一次插入多个值。
    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多