相关疑难解决方法(0)

使用merge..output获取source.id和target.id之间的映射

很简单,我有两个表Source和Target.

declare @Source table (SourceID int identity(1,2), SourceName varchar(50))
declare @Target table (TargetID int identity(2,2), TargetName varchar(50))

insert into @Source values ('Row 1'), ('Row 2')
Run Code Online (Sandbox Code Playgroud)

我想将所有行移动@Source@Target并知道TargetID每个行,SourceID因为还有表格SourceChild,TargetChild并且需要复制,我需要将新行添加TargetIDTargetChild.TargetIDFK列中.

有几个解决方案.

  1. 使用while循环或游标一次向Target插入一行(RBAR)并使用scope_identity()填充FK TargetChild.
  2. 添加临时列@Target并插入SourceID.然后,您可以加入该列以获取TargetIDFK中的内容TargetChild.
  3. SET IDENTITY_INSERT OFFfor @Target和处理自己分配新值.您将获得一个然后使用的范围TargetChild.TargetID.

我不是那么喜欢他们中的任何人.我到目前为止使用的是游标.

我真正想要做的是使用outputinsert语句的子句.

insert into @Target(TargetName)
output inserted.TargetID, S.SourceID
select SourceName
from @Source as …
Run Code Online (Sandbox Code Playgroud)

sql-server merge sql-server-2008

60
推荐指数
1
解决办法
2万
查看次数

同步表 - UPDATE INSERT DELETE 的顺序重要吗?

我需要每天在 2 个数据库之间同步表,源是 MSSQL 2008,目标是 MSSQL 2005。如果我使用 UPDATE、INSERT 和 DELETE 语句(即更改的 UPDATE 行、INSERT 新行、DELETE 行不再存在),如果我先执行 DELETE 语句会有性能改进吗?即这样 UPDATE 语句就不会查看不需要更新的行,因为它们将被删除。

以下是我需要考虑的其他一些事项。表有1-300万+行,并且由于交易量和业务需求,源DB需要保持在线,查询需要尽可能高效。该作业将每天在目标数据库上的 SQL 服务器代理作业中运行。最重要的是,我是一名 DB 菜鸟!

感谢 StackOverflow 社区,你们太棒了!

sql t-sql sql-server sql-server-2005 sql-server-2008

3
推荐指数
1
解决办法
2940
查看次数

在插入之前检查行是否存在的线程安全方法 - 我的代码是否正确?

我有一个表"INSERTIF",看起来像这样 -

id  value
S1  s1rocks
S2  s2rocks
S3  s3rocks
Run Code Online (Sandbox Code Playgroud)

在将一行插入此表之前,我想检查给定的ID是否存在.如果它不存在,则插入.否则,只需更新值即可.我想以线程安全的方式做到这一点.你能告诉我我的代码是否正确吗?我尝试了它,它的工作原理.但是,我想确保我没有遗漏任何性能问题.

编辑1-我想使用此代码一次插入数百万行.每个insert语句都包含在我显示的代码中.

编辑2 -我不想使用我的代码的UPDATE部分,只插入就足够了.

我不想使用MERGE,因为它只适用于SQL Server 2008及更高版本

谢谢.

代码 -

-- no check insert 
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')

--insert with checking 

begin tran /* default read committed isolation level is fine */
if not exists 
(select * from INSERTIF with (updlock, rowlock, holdlock) 
where ID = 'S1')
BEGIN
INSERT INTO INSERTIF(ID,VALUE)
VALUES('S1', 's1doesNOTrock')
END
else
/* update */
UPDATE INSERTIF
SET VALUE = 's1doesNOTrock'
WHERE ID = …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2005 sql-server-2008

-1
推荐指数
1
解决办法
2965
查看次数