151

我需要找出一个函数是否存在于数据库中,以便我可以删除它并再次创建它。它基本上应该类似于我用于存储过程的以下代码:

IF EXISTS (
     SELECT  *
     FROM    dbo.sysobjects
     WHERE   id = OBJECT_ID(N'[dbo].[SP_TEST]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
4

5 回答 5

224

这是 SSMS 在您使用该DROP and CREATE选项编写脚本时使用的内容

IF EXISTS (SELECT *
           FROM   sys.objects
           WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                  AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
  DROP FUNCTION [dbo].[foo]

GO 

这种部署更改的方法意味着您需要重新创建对象的所有权限,因此您可以考虑ALTER使用 -ing if Exists 代替。

于 2011-03-24T12:30:40.577 回答
66

我倾向于使用 Information_Schema:

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'FUNCTION' ) 

函数和Routine_Type存储过程的更改

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'PROCEDURE' ) 
于 2011-09-22T10:51:02.183 回答
49

为什么不只是:

IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

的第二个参数object_id是可选的,但可以帮助识别正确的对象。此类型参数有许多可能的值,特别是:

  • FN : 标量函数
  • IF : 内联表值函数
  • TF:表值函数
  • FS : 汇编 (CLR) 标量函数
  • FT : 汇编 (CLR) 表值函数
于 2015-09-21T13:18:04.703 回答
12

我知道这个线程很旧,但我只是想为那些认为它AlterDrop和更安全的人添加这个答案Create。以下将AlterFunction如果它存在或Create它如果不存在:

  IF NOT EXISTS (SELECT *
               FROM   sys.objects
               WHERE  object_id = OBJECT_ID(N'[dbo].[foo]')
                      AND type IN ( N'FN', N'IF', N'TF', N'FS', N'FT' ))
       EXEC('CREATE FUNCTION [dbo].[foo]() RETURNS INT AS BEGIN RETURN 0 END')
  GO
  ALTER FUNCTION [dbo].[foo]
  AS
  ...
于 2017-06-06T08:03:33.347 回答
11

我发现您可以使用一种非常不冗长且直接的方法来检查各种 SQL Server 对象的存在:

IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1

这是基于 SQL 2005+ 中可用的 OBJECTPROPERTY 函数。可以在此处找到 MSDN 文章。

OBJECTPROPERTY 函数使用以下签名:

OBJECTPROPERTY ( id , property ) 

您将文字值传递给属性参数,指定您要查找的对象的类型。您可以提供大量的值。

于 2015-02-13T21:46:27.770 回答