我正在编写一个SQL Server数据迁移脚本。当我从SQL Server Management Studio(SSMS)运行它时,数据迁移工作正常,但是当我尝试从Liquibase运行它时,数据迁移失败。我进行了调查,当我尝试使用BEGIN..END语句块或带有BEGIN TRANSACTION和COMMIT TRANSACTION的任何手动事务控制时,尽管该脚本在SSMS中有效,但在Liquibase中却失败了。这是可以在Liquibase中运行的代码示例,没有任何语句块或事务控制:
DECLARE @DOC_COUNT int
SELECT @DOC_COUNT = COUNT(*) FROM old_doc_table WHERE ITEM_TYPE = 'DOCUMENT'
SET IDENTITY_INSERT DOCUMENT ON
WHILE ((SELECT COUNT(*) FROM DOCUMENT) < @DOC_COUNT)
INSERT INTO DOCUMENT (
ID,
VERSION,
...
)
SELECT TOP 500
ID,
VERSION,
...
FROM old_doc_table odt
WHERE odt.ITEM_TYPE = 'DOCUMENT'
AND odt.ID NOT IN (SELECT ID FROM DOCUMENT);
SET IDENTITY_INSERT DOCUMENT OFF
我怀疑数据迁移将花费一些时间,因此我真的想将其拆分为单独的事务。 Viz:
我可以添加适当的BEGIN TRANSACTION和COMMIT TRANSACTION调用,并验证SQL在SSMS中能否正常运行,但是在Liquibase中失败,因为该脚本有SQL错误。我在Liquibase中这样运行:
<changeSet id="migrateDocumentData" author="proctorh">
<sqlFile path="sql/migrateDocumentData.sql" relativeToChangelogFile="true"/>
</changeSet>
我知道Liquibase变更集具有runInTransaction布尔值属性,我计划将此变更集设置为false,但是直到解决语法错误之前,我什至无法正确测试。
有什么想法可以使其正常工作吗?