Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net ';创建函数&x27;必须是查询批处理中的第一条语句。实体框架代码优先_.net_Entity Framework_Sql Server 2008_Ef Code First_Entity Framework Migrations - Fatal编程技术网

.net ';创建函数&x27;必须是查询批处理中的第一条语句。实体框架代码优先

.net ';创建函数&x27;必须是查询批处理中的第一条语句。实体框架代码优先,.net,entity-framework,sql-server-2008,ef-code-first,entity-framework-migrations,.net,Entity Framework,Sql Server 2008,Ef Code First,Entity Framework Migrations,我有一些使用实体框架、代码优先方法生成的内联SQL脚本(函数和存储过程) 更新数据库-脚本-源迁移:0 通过上面的命令,我获得了在测试或生产中执行的SQL脚本文件 但是,由于以下错误,我无法运行生成的脚本: 'CREATE FUNCTION' must be the first statement in a query batch. 脚本生成为: 如果@CurrentMigration

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

更新数据库-脚本-源迁移:0

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

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

'CREATE FUNCTION' must be the first statement in a  query batch. 
脚本生成为:

如果@CurrentMigration<'201410150019333\u CreatefnGenerateRequestCode' 开始 创建函数[dbo]。[fnGenerateRequestCode]( @userID varchar(最大值) )
返回varchar(14)
作为


如何修复此问题?

您必须生成代码并将其作为动态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
你可以避免

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

将sql放入EXEC命令中而不添加GO语句时出错:

Sql(EXEC('BEGIN CREATE FUNCTION etc'))
参考:


您需要在第一条EXEC语句上执行前面的语句,然后在另一条EXEC语句中运行CREATE函数

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

非常感谢。最终走上了我一开始不想走的路。还是比那个错误要好。@elle0087。是的,只要将sql文件嵌入到程序集中就可以了。