在两个相同表之间的块中复制数据时,数据会发生更改

简而言之,我正在尝试使用Insert [NewTable] Select Top X * from [Table]批量将数据从一个表复制到另一个几乎相同的表(减去约束,索引,并将精度更改为小数列),但 >复制期间某些数据正在更改。继续阅读以获取更多详细信息。

为什么我们要首先复制

我们正在更改最大表中几列的精度,并且没有时间在部署窗口中执行简单的alter语句。作为替代方案,我们决定使用新架构创建一个表,并在部署前几天批量复制数据,以使我们能够简单地删除旧表并在部署窗口中重命名该表。

新旧表的创建脚本

这些不是我们数据库中的确切表,但已针对此问题进行了精简。实际表有约100列。

CREATE TABLE [dbo].[Table]
(
    [Id] BIGINT NOT NULL PRIMARY KEY NONCLUSTERED IDENTITY,[ForeignKey1] INT NOT NULL,[ForeignKey2] INT NOT NULL,[ForeignKey3] INT NOT NULL,[Name] VARCHAR(MAX) NOT NULL,[SomeValue] DECIMAL(14,5) NULL,CONSTRAINT [FK_Table_ForeignKeyTable1] FOREIGN KEY ([ForeignKey1]) REFERENCES [ForeignKeyTable1]([ForeignKey1]),CONSTRAINT [FK_Table_ForeignKeyTable2] FOREIGN KEY ([ForeignKey2]) REFERENCES [ForeignKeyTable2]([ForeignKey2]),CONSTRAINT [FK_Table_ForeignKeyTable3] FOREIGN KEY ([ForeignKey3]) REFERENCES [ForeignKeyTable3]([ForeignKey3]),)

GO

CREATE INDEX [IX_Table_ForeignKey2] ON [dbo].[Table] ([ForeignKey2])

GO
CREATE TABLE [dbo].[NewTable]
(
    [Id] BIGINT NOT NULL PRIMARY KEY NONCLUSTERED IDENTITY,[SomeValue] DECIMAL(16,5) NULL
)

我编写的用于复制数据的SQL

DeclARE @BatchSize INT
DeclARE @Count INT
​
-- Leave these the same --
SET @Count = 1
​
-- Update these to modify run behavior --
SET @BatchSize = 5000
​
WHILE @Count > 0
    BEGIN
        SET IDENTITY_INSERT [dbo].[NewTable] ON;
        INSERT INTO [dbo].[NewTable]
            ([Id],[ForeignKey1],[ForeignKey2],[ForeignKey3],[Name],[SomeValue])
        SELECT TOP (@BatchSize)
            [Id],[SomeValue]
        FROM [dbo].[Table]
        WHERE not exists(SELECT 1 FROM [dbo].[NewTable] WHERE [dbo].[NewTable].Id = [dbo].[Table].Id)
        ORDER BY Id
​
        SET @Count = @@ROWCOUNT
​
        SET IDENTITY_INSERT [dbo].[NewTable] OFF;
    END

问题

在复制过程中,数据似乎以随机的方式出现乱码或被修改。我们看到的大多数(也许是全部)修改后的数据都是针对ForeignKey2列的。我们最终在新表中获得的值似乎是随机的,并且在旧表中根本不存在。似乎没有任何韵律或原因影响它的记录。

例如,这是原始表的一行,而新表的相应行:

旧表

ID:204663
FK1:452
FK2:522413
FK3:11190
名称:蒙面
某个值:0.0

新表格

ID:204663
FK1:452
FK2:120848
FK3:11190
名称:遮罩但与旧表匹配
某个值:0.0

环境

SQL在SSMS中运行。数据库是Azure SQL数据库。

sc111229 回答:在两个相同表之间的块中复制数据时,数据会发生更改

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3150104.html

大家都在问