插入到相同的表,我有:如何从表复制下表记录和使用存储过程的SQL Server
我只想复制那些从0版本记录及其student_id数据是永远在版本1中重复,这意味着不变的记录。我想将所有复制的记录插入到版本为1的同一张表。什么是存储过程。
插入到相同的表,我有:如何从表复制下表记录和使用存储过程的SQL Server
我只想复制那些从0版本记录及其student_id数据是永远在版本1中重复,这意味着不变的记录。我想将所有复制的记录插入到版本为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
。
使用group by
和having 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;
rextester演示:http://rextester.com/JSTNI40605
个回报:
+-----------+------------+--------------+---------+
| record_id | student_id | student_name | version |
+-----------+------------+--------------+---------+
| 11 | 3 | ccc | 1 |
+-----------+------------+--------------+---------+
您可以选择和插入这样
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);
虽然这段代码可能会回答这个问题,但应该总是解释它的作用以及它如何解决问题。 – BDL
您可以通过LEFT试试这个加入:
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 [email protected])
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
问:“什么会被存储过程本”。答:“存储过程将是可能的解决方案之一。”但非常严肃的是,你必须告诉我们你曾经尝试过什么,不要指望得到任何答案。 –