Hi and thanks for reading this.
I am trying to use the IF EXISTS/IF NOT EXISTS statement to check if an Object exist. Basically I want to skip it if it is there or create it if it is not there.
I have writing the code in two different ways but I get an error: Create function must be the only function in the batch. If I place GO between the statements as Illustrated below, I get another warning: Incorrect Syntax near GO.
Where am I going wrong here?
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
Or this:
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
Thanks for checking this out!
Advertisement
Answer
The easiest way to solve this is actually to delete the function if it already exists, and then re-create it:
/* 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
Note the usage of the ‘object_id’ function in the above. This is actually a pretty common way to check for the existence of an object, although it is subject to certain constraints.
You can read more about it here: OBJECT_ID