Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用存储过程SQL Server从表中复制记录并插入到同一个表中_Sql_Sql Server - Fatal编程技术网

如何使用存储过程SQL Server从表中复制记录并插入到同一个表中

如何使用存储过程SQL Server从表中复制记录并插入到同一个表中,sql,sql-server,Sql,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

我有以下表格:


我只想复制那些来自版本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
                 );
其余的只是一个插入。

使用group by并使maxversion=0:

作为一个存储过程,为版本获取一个参数,为没有该版本记录的学生插入记录:并输出插入的行:

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;

您可以像这样选择和插入

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);

您可以通过左连接尝试此操作:

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循环遍历该表并确定需要复制的项,然后将这些值 评估,如果它们满足重新插入的标准,则插入它们

您的代码应该如下所示。在适用的情况下,添加创建过程零件和编辑表格名称 警告:我已经在记事本上写了这些,所以如果你有一些错误,就试着去纠正它们

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

问:这将是什么存储过程。答:存储过程将是可能的解决方案之一。。但是非常严肃地说,你必须向我们展示你已经尝试过的东西,不要期望得到免费的答案。虽然这段代码可能会回答这个问题,但人们应该始终解释它的作用以及它是如何解决问题的。
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
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