.net ';创建函数&x27;必须是查询批处理中的第一条语句。实体框架代码优先
我有一些使用实体框架、代码优先方法生成的内联SQL脚本(函数和存储过程) 更新数据库-脚本-源迁移:0 通过上面的命令,我获得了在测试或生产中执行的SQL脚本文件 但是,由于以下错误,我无法运行生成的脚本:.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
'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文件嵌入到程序集中就可以了。