我需要找出数据库中是否存在函数,以便可以删除它并再次创建它。它基本上应该类似于我用于存储过程的以下代码:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
我需要找出数据库中是否存在函数,以便可以删除它并再次创建它。它基本上应该类似于我用于存储过程的以下代码:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
Answers:
这是使用DROP and CREATE
选项编写脚本时SSMS所使用的
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(如果存在)。
我倾向于使用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', 'FN') IS NOT NULL
BEGIN
DROP FUNCTION [dbo].[YourFunctionName]
END
GO
的第二个参数object_id
是可选的,但可以帮助识别正确的对象。此类型参数有很多可能的值,尤其是:
CREATE TABLE YourFunctionName(X INT);
那么运行代码将失败。
object_id('YourFunction', 'FN')
或任何其他可以清楚地表明您所指的对象的指示符(第二个参数)即可。
我发现您可以使用一种非常不冗长而直接的方法来以这种方式检查各种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
这是基于OBJECTPROPERTY函数的,该函数在SQL 2005+中可用。您可以在此处找到MSDN文章。
OBJECTPROPERTY函数使用以下签名:
OBJECTPROPERTY ( id , property )
您将一个文字值传递给property参数,以指定要查找的对象的类型。您可以提供大量的价值清单。
我知道这个线程很旧,但我只想为那些认为Alter
比Drop
and 更安全的人添加这个答案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
...
ALTER OR CREATE