Sql 遗留数据库格式迁移

Sql 遗留数据库格式迁移,sql,sql-server,Sql,Sql Server,首先,谢谢你过来帮忙 我一整天都在想办法,尽可能快地实现这个迁移概念。基本上我有很多这样的行: WO-ID|Line Number|Note Tran Number|Note 1 |1 |1 |... 50 char 1 |1 |2 |... 30 char 1 |1 |3 |5 char 在所有这一切结束时,我需要将它们放在一起,在它们之

首先,谢谢你过来帮忙

我一整天都在想办法,尽可能快地实现这个迁移概念。基本上我有很多这样的行:

WO-ID|Line Number|Note Tran Number|Note
1    |1          |1               |... 50 char
1    |1          |2               |... 30 char
1    |1          |3               |5 char
在所有这一切结束时,我需要将它们放在一起,在它们之间插入回车符,然后需要将它们分解回60个字符的文本,即:

WO-ID|Line Number|Note Tran Number|Note
1    |1          |1               |...50 char from line 1 and 10 char from line 2
1    |1          |2               |...20 char from tran 2 and 5 char from tran 3
现在,我确实有多种方法可以使用,但我正在努力寻找最快的方法来实现这一点。将字符串连接在一起并添加回车符既快又容易,但是拆分它们的过程需要很长时间,因为字符串最终拆分成的事务越多。目前,拥有107K条记录的数据集上所有注释的总长度为4244809个字符

所有记录包括300个字符,是3829351。这将在大约50秒内完成。剩下的415458需要1分45秒

这是我正在使用的查询。如果有更好的方式,我想知道一个比我现在做的更好的方式来做这些页面!很明显,有一种更快的方法可以插入多个值,但我不太同意:

Declare @SplitSize int;

declare @numbersTable table (number int);
insert into @numbersTable values(1);
insert into @numbersTable values(2);
insert into @numbersTable values(3);
insert into @numbersTable values(4);
insert into @numbersTable values(5);
insert into @numbersTable values(6);
insert into @numbersTable values(7);
insert into @numbersTable values(8);
insert into @numbersTable values(9);
insert into @numbersTable values(10);
insert into @numbersTable values(11);
insert into @numbersTable values(12);
insert into @numbersTable values(13);
insert into @numbersTable values(14);
insert into @numbersTable values(15);
insert into @numbersTable values(16);
insert into @numbersTable values(17);
insert into @numbersTable values(18);
insert into @numbersTable values(19);
insert into @numbersTable values(20);
insert into @numbersTable values(21);
insert into @numbersTable values(22);
insert into @numbersTable values(23);
insert into @numbersTable values(24);
insert into @numbersTable values(25);
insert into @numbersTable values(26);
insert into @numbersTable values(27);

Set @SplitSize = 60;

Select Main.wo_note_fac, main.wo_note_ro_num, main.wo_note_line_num,
        n.Number,SubString(main.note, @SplitSize*(n.Number -1) + 1, @SplitSize)
From (

        SELECT DISTINCT note2.wo_note_fac,  note2.wo_note_ro_num, note2.wo_note_line_num,
            (
                SELECT rtrim(note1.wo_note) + char(10)  AS [text()]
                FROM dbo.wonotes note1
                WHERE note1.wo_note_fac = note2.wo_note_fac and note1.wo_note_ro_num = note2.wo_note_ro_num and note1.wo_note_line_num != 0 and note2.wo_note_line_num = note1.wo_note_line_num
                ORDER BY note1.A4GLIdentity
                FOR XML PATH ('') ,TYPE).value('.','NVARCHAR(MAX)') --need this .value thing to make sure xml characters aren't escaped
             [note]
        FROM dbo.wonotes note2

)main
Inner Join @numbersTable n On @SplitSize*n.Number < Len(main.note) + @SplitSize

我们的客户在该表中有1000万条以上的记录,我希望他们在2.5小时或更长的时间内不要停机

有没有办法创建一个并排的表格,在其中推送结果,然后将其联机?您可以添加rowversion列或last datetime changed列,这样您就可以在进行交换之前处理自次表创建以来的任何更改。我同意上面的Igor。我认为没有任何方法可以避免这样的问题,即您正在读取每一行,根据其他行执行逻辑,然后将其放回同一个表中。我想在这里提供帮助。。。但我似乎不明白你想做什么。第一个示例的所有行号都设置为1,但第二个示例的行号大于1。@Igor我将对此进行研究!我得看看这在大局中是如何运作的!我们既有内部客户,也有托管客户,所以我必须看看这对我们的内部客户有何作用。基本上是一个预更新,以获取大部分数据,然后修复在预更新和更新之间更改的其余数据。您可以将注释作为varcharmax字段,并创建一个用于读取的视图,将注释输出动态拆分为60个字符的行吗?当然,转换速度会更快,所以唯一的问题是,如果对代码进行save+更改时拆分和重新连接所增加的开销对于实现目标来说是过度的工作。