যদি কোনও ফাংশন ইতিমধ্যে বিদ্যমান থাকে তবে কীভাবে বাদ দেব?


101

আমি জানি এটি অবশ্যই সহজ হতে পারে তবে আমি কোনও ফাংশন তৈরির উপস্থাপনা করব কিনা তা পরীক্ষা করে দেখতে ইতিমধ্যে বিদ্যমান কিনা? যদি এটি বিদ্যমান থাকে তবে আমি এটিকে ফেলে এবং পুনরায় তৈরি করতে চাই।

উত্তর:


187
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

আপনি যদি সিস * টেবিলগুলি এড়াতে চান তবে আপনি এর পরিবর্তে এটি করতে পারেন ( এখান থেকে উদাহরণস্বরূপ এ):

IF object_id(N'function_name', N'FN') IS NOT NULL
    DROP FUNCTION function_name
GO

আপনি যে ধরণের ফাংশন মুছার চেষ্টা করছেন তা ধরার মূল বিষয় হ'ল (শীর্ষস্থানীয় এসকিএল এফএন, আইএফ এবং টিএফ দ্বারা চিহ্নিত):

  • এফএন = স্কেলার ফাংশন
  • আইএফ = ইনলাইনড টেবিল ফাংশন
  • টিএফ = টেবিল ফাংশন

আরে ধন্যবাদ, আমি জানতাম না অবজেক্ট_আইডির বস্তুর ধরণের দ্বিতীয় প্যারামিটার ছিল
স্পার্কি

1
প্রদত্ত অবজেক্টের নাম (যা সিস.অবজেক্টে প্রদর্শিত হয়) অনন্য হতে হবে, কোস্টিং xtype অপ্রয়োজনীয়। একই নামের সাথে একটি টেবিল এবং একটি সঞ্চিত
প্রোক

22
if object_id('FUNCTION_NAME') is not NULL
   DROP FUNCTION <name>

আপনি সিসোবজেক্টগুলিতেও নামটি দেখতে পারেন

IF EXISTS (SELECT * 
       FROM   sysobjects 
           WHERE name='<function name>' and xtype='FN'

আসলে, যদি ফাংশনটি কোনও টেবিল ফাংশন হতে পারে তবে আপনাকে ব্যবহার করা দরকার

xtype in ('FN','TF')

2
আমি সর্বদা অবজেক্ট_আইড পদ্ধতিটিকে প্রাধান্য দিয়েছি, কোডটিতে পড়া সহজ বলে মনে হচ্ছে। মাইক্রোসফ্ট উত্পন্ন নমুনা কোডটির পরিবর্তে সিএস.ওবজেক্টস লুপ ব্যবহার করে কেন সর্বদা আগ্রহী ...
স্পার্কি

12

এটি কেবল কোনও ফাংশন নয়, কোনও বস্তুর জন্য কাজ করে:

IF OBJECT_ID('YourObjectName') IS NOT NULL 

তারপরে কেবল আপনার বস্তুর স্বাদ যুক্ত করুন:

IF OBJECT_ID('YourFunction') IS NOT NULL
   DROP FUNCTION YourFunction

11

এসকিউএল সার্ভার 2016 এ পদ্ধতিটি ড্রপ এবং পুনরায় তৈরি করার জন্য আপনার কাছে দুটি বিকল্প রয়েছে।

এসকিউএল সার্ভার 2016 থেকে শুরু হচ্ছে - ব্যবহার করুন IF EXISTS

DROP FUNCTION [ IF EXISTS ] { [ schema_name. ] function_name } [ ,...n ]   [;]

এসকিউএল সার্ভার 2016 এসপি 1 থেকে শুরু করে - ব্যবহার করুন OR ALTER

CREATE [ OR ALTER ] FUNCTION [ schema_name. ] function_name   


2

আমি সাধারণত সিএস * টাইপ টেবিলগুলি থেকে প্রশ্নগুলি থেকে বিরত থাকি, বিক্রেতারা এগুলি প্রকাশের মধ্যে প্রধান বা অন্যথায় পরিবর্তন করতে থাকে। আমি সর্বদা যা করেছি তা হ'ল DROP FUNCTION <name>বিবৃতি জারি করা এবং কোনও এসকিউএল ত্রুটি যাতে ফিরে আসতে পারে সে সম্পর্কে চিন্তা না করা। আমি সেই মানক পদ্ধতিটি ডিবিএ রাজ্যে বিবেচনা করি।


1
sys। এসকিউএল সার্ভারে 2005 সরকারী উপায়। এগুলি আজকাল টেবিল নয় এমন দর্শন s
gbn

2

SQL Server 2016 CTP3আপনি থেকে বড় মোড়কের পরিবর্তে নতুন ডিআইই বিবৃতি ব্যবহার করতে পারেনIF

বাক্য গঠন :

ফাংশন ড্রপ [যদি উপস্থিত থাকে] {[স্কিমা_নাম। ] ফাংশন_নাম} [, ... এন]

প্রশ্ন:

DROP Function IF EXISTS udf_name

আরও তথ্য এখানে


0
IF EXISTS
      (SELECT * 
      FROM schema.sys.objects
      WHERE name = 'func_name')
    DROP FUNCTION [dbo].[func_name]
GO

0

এই আমার গ্রহণ করা এখানে:

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;

0

যদি কার্যের জন্য উপস্থিত থাকে তবে পরীক্ষা করুন

 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

যদি সঞ্চিত পদ্ধতির জন্য অস্তিত্ব থাকে তা নীচের লিঙ্কে ক্লিক করে ফাংশনটি পরীক্ষা করুন http://www.gurujipPoint.com/2017/05/check-if-exist-for-trigger-function-and.html


0

আপনি যদি এসকিউএল আইএসও স্ট্যান্ডার্ড INFORMATION_SCHEMA ব্যবহার করতে চান এবং এসকিউএল সার্ভার-নির্দিষ্ট নয় sysobjects, আপনি এটি করতে পারেন:

IF EXISTS (
    SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_NAME = N'FunctionName'
)
   DROP FUNCTION [dbo].[FunctionName]
GO
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.