“CREATE FUNCTION”必须是查询批处理中的第一个语句。实体框架代码优先。

6

我有一些使用Entity Framework的Code First方法生成的内联SQL脚本(函数和存储过程)。

Update-Database -Script -SourceMigration:0

通过上述命令,我获取了SQL脚本文件,可以在测试或生产环境执行该文件。

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

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

脚本生成的代码如下:

IF @CurrentMigration < '201410150019333_CreatefnGenerateRequestCode' BEGIN CREATE FUNCTION [dbo].[fnGenerateRequestCode] ( @userID varchar(max) )
RETURNS varchar(14)
as

我该如何修复这个问题?

3个回答

4

您可以通过将SQL语句放在EXEC命令中来避免错误,而无需添加GO语句:

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

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

Reference:

https://dev59.com/tWQn5IYBdhLWcg3wGD1s#20352867


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

谢谢!最终走了我一开始不想走的路,但仍然比那个错误要好。 - codebased
@elle0087。只要您将 SQL 文件嵌入到程序集中,就可以了。 - codebased

0

您需要在第一条EXEC语句中执行前面的语句,然后在另一个EXEC语句中运行CREATE FUNCTION。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接