【问题标题】:Copying All Rows from child Table into Child Table whith New Id on the basis of parent Id根据父ID将所有行从子表复制到具有新ID的子表中
【发布时间】:2013-10-14 22:15:33
【问题描述】:

我有一个父表,它存储 Employee 的数据,它的子表 Salary 存储有关特定员工薪水的所有数据基于 EmployeeId 我想获取所有薪水行并将它们再次插入到薪水表中使用不同的 ID 我无法使 ID 自动递增。我需要使用存储过程来做到这一点。

提前致谢。

我使用的是 Sqlserver 2008。

Employee Table
Id Name      Country 
1. Employee1 Pakistan
2. Employee2 India

Salary Table
Id EmployeeId Month Salary
1. 1          Jan   20000
2. 1          feb   25000
3. 1          Mar   30000

现在我有员工 ID 1,我想通过它从工资表中获取所有行,然后将它们再次插入到具有新 ID 的同一个工资表中。

【问题讨论】:

  • 您能给我们展示一个数据示例和预期输出吗?您知道第二个 ID 是什么,还是需要查找它,还是必须使用身份查找?
  • 你能告诉我们你当前的存储过程吗?
  • 好的,伙计们可以看看现在够了还是我需要做更多,请告诉我。
  • 我做对了吗:Salary.Id不是IDENTITY,您不能这样做吗?

标签: .net sql database sql-server-2008 tsql


【解决方案1】:

嗯,据我了解,你应该可以做到

DECLARE @NewID INT = 2

INSERT INTO Salary (EmployeeId,Month,Salary)
SELECT @NewID, Month, Salary
FROM Salary
WHERE EmployeeId = 1

SQL Fiddle DEMO

【讨论】:

  • 好吧,我不能这样声明@NewId,因为我不知道在 Salary 表中这个 EmployeeId 到底有多少条记录。
  • 您的回答非常有帮助,但问题是我不知道如何处理工资表(子表)的 Id 属性,同时插入所有具有此employeeId 的行。通常我从 c# 代码生成它们。
  • @khalidkhan - 你的意思是你的代码在 Salary 表中计算 Id,而不是仅仅将其标记为 IDENTITY 并让 SQL Server 生成它?
【解决方案2】:

这是你想要的东西

DECLARE @NewID INT 

set @NewID=(select top 1 id from Employee e left join salary s on e.id=s.EmployeeId where s.id is null)
INSERT INTO Salary (EmployeeId,Month,Salary)
SELECT @NewID, Month, Salary
FROM Salary
WHERE EmployeeId = 1

【讨论】:

    【解决方案3】:
    CREATE PROC INSERTDETAILS1 (@EmpID int)
    AS
    BEGIN
    DECLARE @Sal NUMERIC(18,2)
    
    DECLARE Sal_Cursor CURSOR -- Declare cursor
    
    LOCAL SCROLL STATIC
    
    FOR
    
    Select Salary FROM EmpSal where EmpID=@EmpID
    
    OPEN Sal_Cursor -- open the cursor
    
    FETCH NEXT FROM Sal_Cursor
    
       INTO @Sal
    
       INSERT INTO EmpSal VALUES ((SELECT TOP(1) EmpID FROM EmpSal ORDER BY EmpID DESC)+1,@Sal)
    
    
    WHILE @@FETCH_STATUS = 0
    
    BEGIN
    
       FETCH NEXT FROM Sal_Cursor
    
       INTO @Sal
    
       INSERT INTO EmpSal VALUES ((SELECT TOP(1) EmpID FROM EmpSal ORDER BY EmpID DESC)+1,@Sal)
    
    END
    
    
    CLOSE Sal_Cursor -- close the cursor
    
    DEALLOCATE Sal_Cursor -- Deallocate the cursor
    
    END
    

    【讨论】:

    • 根据您的设计重命名表和列。
    • 我也有疑问..您的 ID 列是否是 IDENTITY 列..???这个 NewID - ID 列或 EmployeeID 列是指哪个 id..??如果您回复同样的我可以回答它acoordingly..
    • 非常感谢 Rahul,Id 列不是 IDENTITY 列,ID 列是指工资表的 Id 列。
    • 我可以在 sql server 2008 中使用这个解决方案吗
    【解决方案4】:

    如果Salary.Id 不是也不能是IDENTITY 列,您可以使用ROW_NUMBER 函数将行号分配给您要复制的子集,并将这些添加到最后一个Id 值中表来获取新的Ids:

    INSERT INTO Salary (Id, EmployeeId, Month, Salary)
    SELECT
      Id         = (SELECT MAX(Id) FROM Salary) + ROW_NUMBER() OVER (ORDER BY Id),
      EmployeeId = @NewEmpId,
      Month,
      Salary
    FROM Salary
    WHERE EmployeeId = @SrcEmpId
    ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      相关资源
      最近更新 更多