Saya perlu mencari tahu apakah suatu fungsi ada di database, sehingga saya bisa melepaskannya dan membuatnya lagi. Ini pada dasarnya harus menjadi sesuatu seperti kode berikut yang saya gunakan untuk prosedur tersimpan:
IF EXISTS (
SELECT *
FROM dbo.sysobjects
WHERE id = OBJECT_ID(N'[dbo].[SP_TEST]')
AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )
sql
sql-server
sql-function
Dr Greenthumb
sumber
sumber
Saya cenderung menggunakan Information_Schema:
IF EXISTS ( SELECT 1 FROM Information_schema.Routines WHERE Specific_schema = 'dbo' AND specific_name = 'Foo' AND Routine_Type = 'FUNCTION' )
untuk fungsi, dan perubahan
Routine_Type
untuk prosedur yang tersimpanIF EXISTS ( SELECT 1 FROM Information_schema.Routines WHERE Specific_schema = 'dbo' AND specific_name = 'Foo' AND Routine_Type = 'PROCEDURE' )
sumber
Mengapa tidak hanya:
IF object_id('YourFunctionName', 'FN') IS NOT NULL BEGIN DROP FUNCTION [dbo].[YourFunctionName] END GO
Argumen kedua
object_id
adalah opsional, tetapi dapat membantu mengidentifikasi objek yang benar. Ada banyak kemungkinan nilai untuk argumen tipe ini, khususnya:sumber
CREATE TABLE YourFunctionName(X INT);
kemudian menjalankan kode tersebut akan gagal.object_id('YourFunction', 'FN')
atau penanda lain (argumen kedua) yang menjelaskan jenis objek yang Anda maksud.Saya telah menemukan Anda dapat menggunakan pendekatan yang sangat tidak bertele-tele dan langsung untuk memeriksa keberadaan berbagai objek SQL Server dengan cara ini:
Ini didasarkan pada fungsi OBJECTPROPERTY yang tersedia di SQL 2005+. Artikel MSDN dapat ditemukan di sini .
Fungsi OBJECTPROPERTY menggunakan tanda tangan berikut:
Anda meneruskan nilai literal ke dalam parameter properti, yang menunjukkan tipe objek yang Anda cari. Ada banyak sekali daftar nilai yang dapat Anda berikan.
sumber
Saya tahu utas ini sudah tua tetapi saya hanya ingin menambahkan jawaban ini untuk mereka yang percaya ini lebih aman
Alter
daripadaDrop
danCreate
. Di bawah ini akanAlter
menjadiFunction
jika itu ada atauCreate
jika tidak: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 ...
sumber
ALTER OR CREATE