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
但显示错误
ALTER FUNCTION必须是批处理中的单个查询
知道这里有什么问题吗?
你必须确保它是在一个单独的批处理中编译和执行的.最简单的方法是通过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
这也避免了另一个问题 -  SQL Server希望在开始执行它之前编译每个批处理.但如果不存在,则无法编译原始批次.您不能使用运行时检查()来避免编译时错误 - 除非您确定,如上所述,在检查完成后进行编译.fnTestFunc IF