如何检查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。 有一个你可以提供的价值巨大的清单。
我知道这个线程是旧的,但我只是想为那些相信比Drop
和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 PROCEDURE [dbo].[foo] AS ...