これは簡単でなければならないことは知っていますが、関数の作成の前に、関数が既に存在するかどうかをチェックする方法を教えてください。存在する場合は、ドロップして再作成します。
IF EXISTS (
SELECT * FROM sysobjects WHERE id = object_id(N'function_name')
AND xtype IN (N'FN', N'IF', N'TF')
)
DROP FUNCTION function_name
GO
Sys *テーブルを避けたい場合は、代わりにできます(例Aの here から):
IF object_id(N'function_name', N'FN') IS NOT NULL
DROP FUNCTION function_name
GO
キャッチする主なものは、削除しようとしている関数のタイプです(トップSQLではFN、IF、TFで示されます)。
if object_id('FUNCTION_NAME') is not NULL
DROP FUNCTION <name>
Sysobjectsで名前を調べることもできます
IF EXISTS (SELECT *
FROM sysobjects
WHERE name='<function name>' and xtype='FN'
実際、関数が表関数である可能性がある場合は、使用する必要があります
xtype in ('FN','TF')
これは、関数だけでなくanyオブジェクトに対しても機能します。
IF OBJECT_ID('YourObjectName') IS NOT NULL
次に、次のようにオブジェクトのフレーバーを追加します。
IF OBJECT_ID('YourFunction') IS NOT NULL
DROP FUNCTION YourFunction
SQL Server 2016でプロシージャを削除して再作成するには、2つのオプションがあります。
SQL Server 2016以降-「IF EXISTS」を使用
DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]
[;]
SQL Server 2016 SP1以降-「OR ALTER」を使用
CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name
IF EXISTS
(SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'functionName')
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION functionName
GO
私は通常、sys *タイプのテーブルからのクエリを避けます。ベンダーは、メジャーまたはそれ以外のリリース間でこれらを変更する傾向があります。私がいつもしてきたことは、DROP FUNCTION <name>
ステートメントを発行することであり、戻ってくるSQLエラーを心配することはありません。 DBA領域での標準手順を検討します。
SQL Server 2016 CTP3
から、大きなIF
ラッパーの代わりに新しいDIEステートメントを使用できます。
構文:
ドロップ関数[存在する場合] {[schema_name。 ] function_name} [、... n]
クエリ:
DROP Function IF EXISTS udf_name
詳細 here
SQL Server固有のsysobjects
ではなく、SQL ISO標準のINFORMATION_SCHEMAを使用する場合、これを実行できます。
IF EXISTS (
SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
DROP FUNCTION [dbo].[FunctionName]
GO
これについての私の見解は次のとおりです。
if(object_id(N'[dbo].[fn_Nth_Pos]', N'FN')) is not null
drop function [dbo].[fn_Nth_Pos];
GO
CREATE FUNCTION [dbo].[fn_Nth_Pos]
(
@find char, --char to find
@search varchar(max), --string to process
@nth int --occurrence
)
RETURNS int
AS
BEGIN
declare @pos int --position of nth occurrence
--init
set @pos = 0
while(@nth > 0)
begin
set @pos = charindex(@find,@search,@pos+1)
set @nth = @nth - 1
end
return @pos
END
GO
--EXAMPLE
declare @files table(name varchar(max));
insert into @files(name) values('abc_1_2_3_4.gif');
insert into @files(name) values('zzz_12_3_3_45.gif');
select
f.name,
dbo.fn_Nth_Pos('_', f.name, 1) as [1st],
dbo.fn_Nth_Pos('_', f.name, 2) as [2nd],
dbo.fn_Nth_Pos('_', f.name, 3) as [3rd],
dbo.fn_Nth_Pos('_', f.name, 4) as [4th]
from
@files f;
関数の存在を確認する
IF EXISTS (SELECT TOP 1 1 FROM sys.objects WHERE
object_id = OBJECT_ID(N'[Schema].[function_Name]')
AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
BEGIN
DROP FUNCTION [Schema].[function_Name]
Print('function dropped => [Schema].[function_Name]')
END
GO
ストアドプロシージャのIFが存在するかどうかを確認するには、以下のリンクをクリックしてください http://www.gurujipoint.com/2017/05/check-if-exist-for-trigger-function-and.html
IF EXISTS
(SELECT *
FROM schema.sys.objects
WHERE name = 'func_name')
DROP FUNCTION [dbo].[func_name]
GO