簡體   English   中英

如何使用存儲過程 SQL Server 從表中復制記錄並插入到同一個表中

[英]How to copy records from table and insert into same table using stored procedure SQL Server

我有下表:

在此處輸入圖片說明

我只想復制那些來自版本 0 的記錄,並且它們的 student_id 在版本 1 中永遠不會重復,這意味着未更改的記錄。 我想將所有復制的記錄插入到版本 1 的同一個表中。為此將使用什么存儲過程。

使用group byhaving max(version) = 0

insert into student_name (student_id, student_name, version)
select student_id, max(student_name), 1
from student_name
group by student_id
having max(version) = 0

作為一個存儲過程,采用version的參數,為沒有該版本記錄的學生插入記錄:並輸出插入的行:

create procedure dbo.insert_new_version (@version int) as
begin;
  set nocount, xact_abort on;

  insert into student_name (student_id, student_name, version)
  output inserted.*
  select 
      student_id
    , student_name = max(student_name)
    , version = @version
  from student_name
  group by student_id
  having max(version) < @version
end;

reextester 演示: http ://rextester.com/JSTNI40605

返回:

+-----------+------------+--------------+---------+
| record_id | student_id | student_name | version |
+-----------+------------+--------------+---------+
|        11 |          3 | ccc          |       1 |
+-----------+------------+--------------+---------+

您可以通過執行以下操作來選擇記錄:

select t.*
from t
where t.version = 0 and
      not exists (select 1
                  from t t2
                  where t2.student_id = t.student_id and t2.version = 1
                 );

其余的只是一個insert

您可以像這樣選擇和插入

Insert INTO tableName select t1.student_Id, t1.student_name,1 from tablename t1 
where t1.version = 0 and not exists 
(select 1 from tablename  t2 where t2.student_id = t.student_id and t2.version = 1);

您可以通過 LEFT Join 嘗試此操作:

INSERT INTO tbl
SELECT  T1.record_id,T1.student_Id,T1.student_name, 1
FROM    tbl T1 LEFT JOIN tbl    T2
ON  T1.student_Id   =   T2.student_Id AND   T2.version      =   1
WHERE   T1.version  =   0 AND       T2.record_id    IS NULL

我建議使用 while 循環遍歷表格並確定您需要復制的項目,然后將評估這些值,如果它們符合重新插入的標准,然后插入它們。

您的代碼應如下所示。 在適用的情況下添加 CREATE PROC 部分和編輯表名(注意:我已將其寫在記事本上,因此如果您遇到一些錯誤,請嘗試修復它們)

DECLARE @counter int = 0, @row_Count int = 0, @currentId int,
@currentName nvarchar(100), @version int, @current_Student_id int

SET @row_Count = (SELECT COUNT(record_Id) from yourTable)

WHILE @counter <= @row_Count
BEGIN
SET @currentId = (SELECT record_Id FROM (SELECT row_number() over (order by id) 
            AS RowNum, record_Id  FROM yourTable) sub WHERE RowNum=@counter)

SET @currentName = (SELECT student_name FROM yourTable WHERE record_Id = @currentId)
SET @current_Student_id = (SELECT student_id FROM yourTable WHERE record_Id = @currentId)
SET @version = (SELECT version FROM yourTable WHERE record_Id = @currentId)

--USE IF to check if the current version is 0 and the student ID has not been inserted already

IF (SELECT COUNT(record_Id) FROM yourTable WHERE student_id = @current_Student_id AND version = 1) < 1
            AND @version = 0
BEGIN
INSERT INTO yourTable (student_id, student_name, version)
    VALUES
(
@current_Student_id,
@currentName,
1
)
END

SET @counter = @counter + 1;
END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM