【问题标题】:Script generated by Update-Database has syntax errors while a normal Update-Database works correctlyUpdate-Database 生成的脚本有语法错误,而正常的 Update-Database 工作正常
【发布时间】:2021-05-07 13:41:43
【问题描述】:

我有一个 .NET Framework 4.8 项目,它使用 Entity Framework 6.2.0 并进行了多次迁移。我的问题是,当我从本地计算机中删除我的数据库并运行 Update-Database 时,数据库已成功创建,但是当我运行 Update-Database -Script 命令并保存我的 SQL 脚本然后运行 ​​SQL 脚本时使用

Invoke-Sqlcmd -InputFile ".\build\artifacts\migration.sql" -ServerInstance "(localdb)\MSSQLLocalDB"

我遇到很多语法错误,例如

Invoke-Sqlcmd : 'CREATE/ALTER PROCEDURE' 必须是查询中的第一条语句 批处理。

在此上下文中不能使用具有返回值的 RETURN 语句。

为什么会出现这些错误? 如何我可以解决它们?为什么正常的update-database可以正常工作,但是SQL脚本有语法错误?

我认为adding 'GO' statements to Entity Framework migrations 进行一些修改可以解决我的问题。

【问题讨论】:

  • @Larnu 我的问题是这个脚本使用Update-Database -Script 自动生成,但是生成的脚本有很多语法错误。无法一一解决
  • sqlcmd 很可能在脚本之前运行了一些语句,但没有开始新的批处理。最喜欢在脚本开头添加SET ANSI_NULLS ON;\r\nGO\r\nSET QUOTED_IDENTIFIER ON;\r\nGO\r\n(其中\r\n 表示回车和换行符)将解决问题。如果没有.\build\artifacts\migration.sql 的内容,很难提出更多建议。
  • 好吧,我看了dba.stackexchange.com/a/34661stackoverflow.com/q/54765112/1539100,怎么说Update-Database 在脚本中添加GO?

标签: sql-server visual-studio entity-framework-6 entity-framework-migrations invoke-sqlcmd


【解决方案1】:

据我们所知,如您所见SQL Server - Must be first statement in query batch - what and why?

来自http://msdn.microsoft.com/en-us/library/ms175502(v=sql.105).aspx

批量使用规则

以下规则适用于使用批处理:

  • 创建默认值,创建函数,创建过程,创建规则,创建 SCHEMA、CREATE TRIGGER 和 CREATE VIEW 语句不能组合使用 与批处理中的其他语句。 CREATE 语句必须启动 批。该批次后面的所有其他语句将是 解释为第一个 CREATE 语句定义的一部分。
  • 无法更改表,然后在表中引用的新列 同一批次。
  • 如果 EXECUTE 语句是批处理中的第一个语句, EXECUTE 关键字不是必需的。 EXECUTE 关键字是必需的 如果 EXECUTE 语句不是批处理中的第一个语句。

问题是当我们生成脚本而不是直接使用Update-Database 时,所有迁移都希望以批处理方式运行,并且当我们在迁移中使用一些违反SQL 规则的手工SQL 脚本时会导致一些错误。

所以要解决这个问题,我们必须在语句的开头添加/**/ GO。 (感谢Ivan Stus

感谢Larnu 帮助我调查问题。

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2015-01-09
    • 2013-01-19
    相关资源
    最近更新 更多