如何检查SQL数据库上是否存在函数

时间:2011-03-24 12:28:22

标签: sql sql-server sql-function

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

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

5 个答案:

答案 0 :(得分:181)

这是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 - 如果存在更改。

答案 1 :(得分:56)

我倾向于使用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' ) 

答案 2 :(得分:27)

为什么不呢:

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

object_id的第二个参数是可选的,但可以帮助识别正确的对象。 该类型的可能值为:

  • FN:标量函数
  • IF:内联表值函数
  • TF:表值函数
  • FS:汇编(CLR)标量函数
  • FT:汇编(CLR)表值函数

答案 3 :(得分:9)

我发现你可以使用非常冗长和直接的方法来检查各种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文章here

OBJECTPROPERTY函数使用以下签名:

OBJECTPROPERTY ( id , property ) 

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

答案 4 :(得分:3)

我知道这个帖子已经过时了,但我只是想为那些认为AlterDropCreate更安全的人添加这个答案。以下Alter Function如果存在,或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
  ...