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

时间:2019-02-17 10:06:58

标签: sql-server ssms

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

我首先尝试使用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;

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

2 个答案:

答案 0 :(得分:0)

  

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

while循环的每次迭代中,整个DocumentTypes表都将更新。这就是原因,您只看到最后一个记录名称出现在整个表中,您必须根据ID将源表和目标表连接在一起。

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

以上查询将在单个查询中将匹配documenttypeid的名称从目标表更新为源表。

注意:您不需要一会儿就可以将名称从源更新为目标。

答案 1 :(得分: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;