我需要查找数据库中是否存在一个函数,以便我可以删除它并重新创建。它应该基本上类似于我用于存储过程的以下代码:
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 )
使用DROP和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
。
我倾向于使用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
的第二个参数是可选的,但有助于标识正确的对象。对于此类型参数,有许多可能的值,特别是:
object_id('YourFunction', 'FN')
或任何其他清晰表明您所引用的对象类型的指示符(第二个参数)即可。 - darlove我知道这个帖子很旧,但是我想为那些认为修改
比删除和创建
更安全的人添加此答案。以下内容将会修改
此函数
(如果存在)或者创建
它(如果不存在):
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
。 - AgentFire我发现你可以使用一种非常简洁直接的方法来检查各种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文章可以在这里找到。
OBJECTPROPERTY函数的签名如下:
OBJECTPROPERTY ( id , property )
您需要将字面值传递到属性参数中,以指定您要查找的对象类型。可以提供大量可用的值。
从SQL Server 2016 SP1开始,SQL Server 2017或更高版本,您可以使用以下语法:
CREATE OR ALTER [object] ...