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

Dr.*_*umb 127 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 )
Run Code Online (Sandbox Code Playgroud)

Mar*_*ith 192

这是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 
Run Code Online (Sandbox Code Playgroud)

这种部署更改的方法意味着您需要重新创建对象的所有权限,以便您可以考虑ALTER使用Exists.

  • 让我想知道**甚至更多**为什么[没有sys.functions](http://stackoverflow.com/questions/468672/sql-server-where-is-sys-functions)系统目录视图.. ... (17认同)

小智 57

我倾向于使用Information_Schema:

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

用于功能,以及更改Routine_Type存储过程

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'PROCEDURE' ) 
Run Code Online (Sandbox Code Playgroud)

  • 酷我正在寻找这样的东西,从来没有找到它.我认为最好使用information_schema,因为它不依赖于特定的RDBMS.(顺便说一句,跨平台兼容的概念来自这个答案:http://stackoverflow.com/a/14290099/420667) (2认同)

Kap*_*apé 34

为什么不呢:

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

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

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

  • 从技术上讲,这可能会失败,因为它只会检查是否存在该名称的对象.不是说有一个对象而且它是一个函数.EG如果`CREATE TABLE YourFunctionName(X INT);`那么运行代码将失败. (4认同)
  • @MartinSmith:很容易变得健壮。只需使用`object_id('YourFunction', 'FN')`或任何其他指示符(第二个参数)来明确您所指的对象类型。 (2认同)

Jer*_*emy 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
Run Code Online (Sandbox Code Playgroud)

这基于SQL 2005+中提供的OBJECTPROPERTY函数.可以在此处找到MSDN文章.

OBJECTPROPERTY函数使用以下签名:

OBJECTPROPERTY ( id , property ) 
Run Code Online (Sandbox Code Playgroud)

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


jam*_*anq 5

我知道这个线程很旧,但是我只想为那些认为AlterDropand 更安全的人添加这个答案Create。下面将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
  ...
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个,但我认为应该是“ ALTER FUNCTION”,不是吗? (2认同)