【问题标题】:'CREATE FUNCTION' must be the first statement in a query batch. Entity Framework Code First'CREATE FUNCTION' 必须是查询批处理中的第一条语句。实体框架代码优先
【发布时间】:2014-11-03 05:22:47
【问题描述】:

我有一些使用实体框架生成的内联 SQL 脚本(函数和存储过程),代码优先方法。

更新-数据库-脚本-SourceMigration:0

通过上面的命令,我得到了我在测试或生产中执行的 SQL 脚本文件。

但是由于以下错误,我无法运行生成的脚本:

'CREATE FUNCTION' must be the first statement in a  query batch. 

脚本生成为:

IF @CurrentMigration 返回 varchar(14)
作为

我该如何解决这个问题?

【问题讨论】:

    标签: .net entity-framework sql-server-2008 ef-code-first entity-framework-migrations


    【解决方案1】:

    你可以避免

    应该是批处理文件中的第一条语句

    通过将 sql 放在 EXEC 命令中而不添加 GO 语句的错误:

    Sql(EXEC('BEGIN CREATE FUNCTION etc'))
    

    参考:

    https://stackoverflow.com/a/20352867/150342

    【讨论】:

      【解决方案2】:

      您必须生成代码并将其作为动态 sql 执行。

      DECLARE @Sql NVARCHAR(MAX)
      SET @Sql = 
      '
      IF OBJECT_ID(''fn_Test'') IS NOT NULL DROP FUNCTION fn_Test
      GO
      
      CREATE FUNCTION fn_Test(@a INT)
      RETURNS INT
      BEGIN
          RETURN @a
      END
      '
      IF 1 = 1
      BEGIN
          EXEC(@Sql)
      END
      

      【讨论】:

      • 谢谢!最终走上了我最初不想走的路。还是比那个错误好。
      • @elle0087。是的,只要您将 sql 文件嵌入到程序集中即可。
      【解决方案3】:

      您需要在第一个 EXEC 语句上执行 CREATE FUNCTION 之前的语句,然后将 CREATE FUNCTION 运行到另一个 EXEC 语句中。

      DECLARE @query NVARCHAR(3000) = ''
      
      SET @query += 'SET ANSI_NULLS ON' + CHAR(10) 
      
      SET @query += 'SET QUOTED_IDENTIFIER ON' + CHAR(10) 
      
      SET @query +=  'IF EXISTS (SELECT *
                                 FROM   sys.objects
                                 WHERE  object_id = OBJECT_ID(N''[dbo].[' + @DB_Name + '_InitCap]'')
                                        AND type IN ( N''FN'', N''IF'', N''TF'', N''FS'', N''FT'' ))
                        DROP FUNCTION [dbo].['+ @DB_Name + '_InitCap]' + CHAR(10)
      
      EXEC sp_executesql @query
      
      SET @query = 'CREATE FUNCTION [dbo].[' + @DB_Name + '_InitCap] ( @InputString varchar(4000) ) RETURNS VARCHAR(4000) AS' + CHAR(10)
      ....
      ....
      EXEC sp_executesql @query
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多