使用EF Core迁移创建PostgreSQL存储过程时遇42601语法错误
EF Core迁移创建PostgreSQL存储过程报错的解决方法
你在EF Core迁移中创建PostgreSQL存储过程时遇到语法错误,但相同SQL在pgAdmin中可正常执行,报错信息如下:
Exception data:
Severity: ERROR
SqlState: 42601
MessageText: syntax error at end of input
Position: 186
File: scan.l
Line: 1184
Routine: scanner_yyerror
你的迁移代码:
protected override void Up(MigrationBuilder migrationBuilder) { var sp = @"CREATE PROCEDURE reset_primary_holder() LANGUAGE SQL BEGIN ATOMIC SELECT * FROM id.users; END;"; migrationBuilder.Sql(sp); }
问题原因
EF Core的Sql方法默认会按分号;拆分SQL语句执行,这会把你的存储过程定义拆成多个独立片段,导致PostgreSQL解析时出现语法错误。
修复方案
调用Sql方法时添加splitStatements: false参数,让EF Core将整个存储过程定义作为单个完整语句执行:
protected override void Up(MigrationBuilder migrationBuilder) { var sp = @"CREATE PROCEDURE reset_primary_holder() LANGUAGE SQL BEGIN ATOMIC SELECT * FROM id.users; END;"; migrationBuilder.Sql(sp, splitStatements: false); }
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

