sql - 如果不存在则创建 UDF(用户定义函数),如果存在则跳过它

标签 sql sql-server tsql

您好,感谢您阅读本文。

我正在尝试使用 IF EXISTS/IF NOT EXISTS 语句来检查对象是否存在。基本上我想跳过它(如果它存在)或创建它(如果它不存在)。

我用两种不同的方式编写代码,但出现错误:创建函数必须是批处理中的唯一函数。如果我将 GO 放置在语句之间,如下所示,我会收到另一个警告:GO 附近的语法不正确。

我哪里出错了?

IF NOT EXISTS
(select * from Information_schema.Routines where SPECIFIC_SCHEMA='dbo' 
AND SPECIFIC_NAME = 'FMT_PHONE_NBR' AND Routine_Type='FUNCTION')

/*CREATE FUNCTION TO FORMAT PHONE NUMBERS*/
CREATE FUNCTION [dbo].[FMT_PHONE_NBR](@phoneNumber VARCHAR(12))
RETURNS VARCHAR(12)
AS
BEGIN
    RETURN SUBSTRING(@phoneNumber, 1, 3) + '-' + 
           SUBSTRING(@phoneNumber, 4, 3) + '-' + 
           SUBSTRING(@phoneNumber, 7, 4)
END

GO

或者这个:

IF NOT EXISTS
(SELECT name FROM sys.objects WHERE name = 'dbo.FMT_PHONE_NBR')

GO

/*CREATE FUNCTION TO FORMAT PHONE NUMBERS*/
CREATE FUNCTION [dbo].[FMT_PHONE_NBR](@phoneNumber VARCHAR(12))
RETURNS VARCHAR(12)
AS
BEGIN
    RETURN SUBSTRING(@phoneNumber, 1, 3) + '-' + 
           SUBSTRING(@phoneNumber, 4, 3) + '-' + 
           SUBSTRING(@phoneNumber, 7, 4)
END

GO

感谢您查看此内容!

最佳答案

解决这个问题的最简单方法实际上是删除该函数(如果它已经存在),然后重新创建它:

/* If we already exist, get rid of us, and fix our spelling */
IF OBJECT_ID('dbo.FMT_PHONE_NBR') IS NOT NULL
  DROP FUNCTION FMT_PHONE_NBR
GO

/*CREATE FUNCTION TO FORMAT PHONE NUMBERS*/
CREATE FUNCTION [dbo].[FMT_PHONE_NBR](@phoneNumber VARCHAR(12))
RETURNS VARCHAR(12)
AS
BEGIN
    RETURN SUBSTRING(@phoneNumber, 1, 3) + '-' + 
           SUBSTRING(@phoneNumber, 4, 3) + '-' + 
           SUBSTRING(@phoneNumber, 7, 4)
END

GO

注意上面“object_id”函数的用法。这实际上是检查对象是否存在的一种非常常见的方法,尽管它受到某些限制。

您可以在这里阅读更多相关信息:OBJECT_ID

关于sql - 如果不存在则创建 UDF(用户定义函数),如果存在则跳过它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8886759/

相关文章:

sql - 检查条件而不是重复 Case When 的更好方法

mysql - 在sql中对一行求和

mysql - 从引用表中选择值

sql-server - 复制对象的架构更改会影响复制吗?

sql-server - SQL 2005 SMO - 查找引用表

sql - 不确定如何加入这两个表

sql-server - 子查询返回了 1 个以上的值。当子查询跟随 = 或当子查询用作表达式时,这是不允许的?

mysql - order byhiredate DESC 在 mysql 中无法按预期工作

asp.net - SQL 连接强行关闭

sql-server - Sql Server 在 while 循环期间打印受影响的行