您好,感谢您阅读本文。
我正在尝试使用IF EXISTS / IF NOT EXISTS语句来检查对象是否存在。基本上,我想跳过它(如果存在)或创建它(如果不存在)。
我用两种不同的方式编写代码,但出现错误:Create函数必须是批处理中唯一的函数。如果我将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