SQL Server中的IF内部的ALTER FUNCTION

Sac*_*har 2 sql t-sql sql-server

我只需要修改一个函数.我试过这个:

IF EXISTS(SELECT * FROM Information_schema.Routines 
          WHERE Specific_schema = 'dbo' 
            AND SPECIFIC_NAME = 'fnTestFunc' 
            AND Routine_Type = 'FUNCTION')
BEGIN
    ALTER FUNCTION [dbo].[fnTestFunc] (@input VARCHAR(3))
    RETURNS VARCHAR(2)
    AS 
    BEGIN
         --something
    END
END
Run Code Online (Sandbox Code Playgroud)

但显示错误

ALTER FUNCTION必须是批处理中的单个查询

知道这里有什么问题吗?

Dam*_*ver 6

你必须确保它是在一个单独的批处理中编译和执行的.最简单的方法是通过sp_executesql:

IF EXISTS(SELECT * FROM Information_schema.Routines WHERE Specific_schema = 'dbo' AND SPECIFIC_NAME = 'fnTestFunc' AND Routine_Type = 'FUNCTION')
BEGIN

EXEC sp_executesql N'ALTER FUNCTION [dbo].[fnTestFunc] (@input VARCHAR(3))

RETURNS VARCHAR(2)

AS BEGIN

    --something
END'

END
Run Code Online (Sandbox Code Playgroud)

这也避免了另一个问题 - SQL Server希望在开始执行它之前编译每个批处理.但如果存在,则无法编译原始批次.您不能使用运行时检查()来避免编译时错误 - 除非您确定,如上所述,在检查完成进行编译.fnTestFunc IF