如何将外键约束表复制到另一个数据库?

问题描述 投票:0回答:2

我正在尝试替换我的开发服务器上的乱码数据(从生产服务器恢复它)。

我首先尝试使用SSMS的“导入数据”任务,但遇到错误说:“无法截断具有外键约束的表”因此我决定执行以下操作:

  1. 在开发服务器上创建表的新临时副本(以避免从生产数据库访问它)。
  2. 写一个更新脚本。

这是我的脚本:

DECLARE @IdToCopy INT;
DECLARE @cnt INT;

SET @IdToCopy = 1
WHILE @IdToCopy <= 55
BEGIN
    UPDATE DocumentTypes
    SET Name = DocumentTypesTemp.Name
    FROM DocumentTypesTemp
    WHERE DocumentTypesTemp.DocumentTypeId = @IdToCopy;

    SET @IdToCopy += 1;
END;

我希望它更新表以具有相同的值,但唯一的值是复制表的最后一行。

sql-server ssms
2个回答
0
投票

我希望它更新表以具有相同的值,但唯一的值是复制表的最后一行。

while循环的每次迭代中,您的整个DocumentTypes表都会更新。这就是为什么你只看到整个表中出现的最后一个记录名,你必须根据id加入源表和目标表。

UPDATE dest 
SET    dest.NAME = src.NAME 
FROM   documenttypes dest 
       INNER JOIN documenttypestemp src 
               ON src.documenttypeid = dest.documenttypeid 

上面的查询将在单个查询中使用匹配的documenttypeid更新目标表到源表的名称。

注意:您不需要使用while循环来更新源到目标的名称。


0
投票

我使用以下内容修复了我的脚本:

DECLARE @IdToCopy INT;
DECLARE @cnt INT;
DECLARE @NameToCopy varchar(256);
SET @IdToCopy=1

SELECT @cnt=COUNT(*) FROM DocumentTypesTemp;

WHILE @IdToCopy <= @cnt
BEGIN
    SELECT @NameToCopy=Name
    FROM DocumentTypesTemp 
    WHERE DocumentTypesTemp.DocumentTypeId=@IdToCopy;

    UPDATE DocumentTypes
    SET Name=@NameToCopy
    WHERE DocumentTypes.DocumentTypeId=@IdToCopy;

    SET @IdToCopy += 1;
END;
© www.soinside.com 2019 - 2024. All rights reserved.