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

我需要找出一个数据库是否存在一个函数,以便我可以放弃它并重新创build它。 它应该基本上像下面的代码,我用于存储过程:

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

这是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 

这种部署更改的方法意味着您需要重新创build对象的所有权限,因此您可以考虑使用ALTER -ing(如果存在)。

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

为什么不只是:

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

至less这对我有用..

我发现你可以使用非常详细和直接的方法来检查存在各种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文章可以在这里find。

OBJECTPROPERTY函数使用以下签名:

 OBJECTPROPERTY ( id , property ) 

您将一个文字值传递给属性参数,指定您正在查找的对象的types。 有一个你可以提供的价值巨大的清单。

我知道这个线程是旧的,但我只是想为那些相信比DropCreate更安全的人添加这个答案。 如果它存在,将会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 PROCEDURE [dbo].[foo] AS ...