我正在尝试替换我的开发服务器上的乱码数据(从生产服务器恢复它)。
我首先尝试使用SSMS的“导入数据”任务,但遇到错误说:“无法截断具有外键约束的表”因此我决定执行以下操作:
这是我的脚本:
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;
我希望它更新表以具有相同的值,但唯一的值是复制表的最后一行。
我希望它更新表以具有相同的值,但唯一的值是复制表的最后一行。
在while
循环的每次迭代中,您的整个DocumentTypes
表都会更新。这就是为什么你只看到整个表中出现的最后一个记录名,你必须根据id加入源表和目标表。
UPDATE dest
SET dest.NAME = src.NAME
FROM documenttypes dest
INNER JOIN documenttypestemp src
ON src.documenttypeid = dest.documenttypeid
上面的查询将在单个查询中使用匹配的documenttypeid
更新目标表到源表的名称。
注意:您不需要使用while循环来更新源到目标的名称。
我使用以下内容修复了我的脚本:
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;