【问题标题】:SQL: Insert new records from 1 table to anotherSQL:将新记录从一个表插入到另一个表
【发布时间】:2013-05-09 07:15:20
【问题描述】:

我有两张学生桌(使用 Microsoft SQL Server 2008 R2 标准版)。我需要编写一个程序,这样如果第一个表有新学生,第二个表也会更新

这不起作用,我不知道为什么:

CREATE PROCEDURE [dbo].[CHECK_NEW]


AS
begin transaction

declare @tempId int
declare @tempName varchar

DECLARE c1 CURSOR FOR  
SELECT kId, kName
FROM table1

OPEN c1

FETCH NEXT FROM c1  
INTO @tempId, @tempName

WHILE @@FETCH_STATUS = 0  
BEGIN

if (SELECT sId FROM table2) NOT IN(@tempId)
insert into table(sId, name) values(@tempId, @tempName)

END

commit

提前致谢

【问题讨论】:

  • “这不起作用” - 不是一个有用的描述。顺便说一句,您不需要使用光标...
  • @MitchWheat 我没有什么要补充的,程序编译时没有错误但是第二个表在我执行时没有更新,我不知道为什么
  • 你为什么要扫描整个表格?为什么不添加触发器(有其自身的问题)或从代码插入 -> 只保留一个添加到表 1 的位置,然后启动一个 txn 并执行此操作。否则,如果您在负载下有更多的 TPS(每秒 Txns),您可能会遇到 db 过度工作的情况
  • @marc_s 抱歉,Microsoft SQL Server
  • OK - 什么版本? 7.0? 2000? 2005 年? 2008 年? 2008 R2? 2012 年?哪个版本:标准?网络?企业?快递?

标签: sql stored-procedures insert sql-server-2008-r2 cursor


【解决方案1】:

试试这样......

CREATE PROCEDURE [dbo].[CHECK_NEW]


AS
Begin Try
begin transaction
         Insert into Table2(ulid,Id,Name) 
     Select newid() as ulid, Id,name from ( Select Row_Number() over(Partition by a.id order by a.id) as row, a.Id,a.name from Table1 a  where
not exists(Select * from Table2b where a.Id=b.Id)) t where row =1
Commit
End Try
Begin Catch
RollBack
End Catch

【讨论】:

  • 问题是,第二个表有一个唯一标识符列“uId”(第一个没有它),不允许为空,并且在添加值时我调用我的函数 newid(),生成它。当我从选择中插入时,我可以添加这个值吗?我的意思是:插入Table2(uId,Id,Name),而第一个值是从函数newid()中添加的,另外两个是从这个插入中添加的?
  • @user2336688 很难理解你想要什么?
  • table2 有这些列:uId(由函数生成的随机值,不允许为 null)、id 和 Name。 uId 不存在于第一个表中,仅存在于第二个表中。如果我按照你写的方式添加它,uId 将保持为空,这将不起作用。如何在插入 uId(调用函数 newid())的同时插入你写的选择中的 2 个其他列?
  • ok...ulid 是由一个函数生成的,它的输入参数和返回类型是什么,
  • 输入无效,只是newid(),它生成一个“唯一标识符”数据类型,uId列接受它
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多