কোনও এসকিউএল ডাটাবেসে কোনও ফাংশন বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


138

ডাটাবেসে কোনও ফাংশন উপস্থিত রয়েছে কিনা তা আমার খুঁজে বের করা উচিত, যাতে আমি এটিকে ফেলে দিয়ে আবার এটি তৈরি করতে পারি। এটি মূলত নীচের কোডের মতো কিছু হওয়া উচিত যা আমি সঞ্চিত পদ্ধতির জন্য ব্যবহার করি:

IF EXISTS (
     SELECT  *
     FROM    dbo.sysobjects
     WHERE   id = OBJECT_ID(N'[dbo].[SP_TEST]')
             AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

উত্তর:


206

DROP and CREATEবিকল্পটি ব্যবহার করে স্ক্রিপ্ট করার সময় এসএসএমএস এটি ব্যবহার করে

IF 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' ))
  DROP FUNCTION [dbo].[foo]

GO 

পরিবর্তনগুলি মোতায়েন করার এই পদ্ধতির অর্থ হল যে আপনাকে অবজেক্টে সমস্ত অনুমতি পুনরায় তৈরি করতে হবে যাতে আপনি ALTERপরিবর্তে উপস্থিত থাকলে- বিবেচনা করতে পারেন ।


17
আমাকে আশ্চর্য করে তোলে আরও বেশি কেন সেখানে sys.functions নয় সিস্টেমের ক্যাটালগ দৃশ্য .....
marc_s

61

আমি তথ্য_স্কেমা ব্যবহার করার ঝোঁক:

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'FUNCTION' ) 

ফাংশনগুলির জন্য, এবং Routine_Typeসঞ্চিত পদ্ধতিগুলির জন্য পরিবর্তন

IF EXISTS ( SELECT  1
            FROM    Information_schema.Routines
            WHERE   Specific_schema = 'dbo'
                    AND specific_name = 'Foo'
                    AND Routine_Type = 'PROCEDURE' ) 

2
শীতল আমি এই জাতীয় কিছু খুঁজছিলাম এবং এটি কখনও পাইনি। আমি বিশ্বাস করি সাধারণভাবে তথ্য_সেমি ব্যবহার করা ভাল কারণ এটি নির্দিষ্ট আরডিবিএমএসের সাথে আবদ্ধ নয়। : (BTW হচ্ছে ক্রস-প্ল্যাটফর্ম সামঞ্জস্যপূর্ণ ধারণা এই উত্তর থেকে এসেছেন stackoverflow.com/a/14290099/420667 )
user420667

40

কেন শুধু:

IF object_id('YourFunctionName', 'FN') IS NOT NULL
BEGIN
    DROP FUNCTION [dbo].[YourFunctionName]
END
GO

দ্বিতীয় তর্কটি object_idalচ্ছিক, তবে সঠিক অবজেক্টটি সনাক্ত করতে সহায়তা করতে পারে। আছে অনেক সম্ভাব্য মান এই ধরনের যুক্তি, বিশেষ করে জন্য:

  • এফএন: স্কেলার ফাংশন
  • আইএফ: ইনলাইন টেবিলের মূল্যবান ফাংশন
  • টিএফ: সারণী-মূল্যবান ফাংশন
  • FS: সমাবেশ (সিএলআর) স্কেলার-ফাংশন
  • এফটি: সমাবেশ (সিএলআর) সারণী-মূল্যবান ফাংশন

4
প্রযুক্তিগতভাবে এটি ব্যর্থ হতে পারে কারণ এটি কেবলমাত্র সেই নামের কোনও অবজেক্ট আছে কিনা তা যাচাই করে। এটি নয় যে কোনও বস্তু আছে এবং এটি একটি ফাংশন। EG CREATE TABLE YourFunctionName(X INT);তবে কোড চালানো ব্যর্থ হবে।
মার্টিন স্মিথ

1
@ মার্টিনস্মিথ: শক্তিশালী করা সহজ। কেবল ব্যবহার করুন object_id('YourFunction', 'FN')বা অন্য কোনও ডিজাইনার (দ্বিতীয় যুক্তি) যা আপনি কোন ধরণের অবজেক্টের উল্লেখ করছেন তা তা পরিষ্কার করে দেয়।
ডারলভ

দ্বিতীয় প্যারামিটার হিসাবে 'এফএন' ব্যবহার করে @darlove কাজ করতে পারে না। আমি শুধু শিখেছি। 'এফএন' অর্থ স্কেলার ফাংশন। এই লিঙ্কটি আপনাকে বিভিন্ন প্যারামিটার মান বলে যে আপনি sqlhints.com/tag/how-to-check-if-function-exists পাস করতে পারেন । বিদ্যমান সারণীর মান ফাংশনটি পরীক্ষা করার জন্য আমি 'এফএন' ব্যবহার করতে থাকি এবং এটি কার্যকর হয় না। আমাকে 'টিএফ' ব্যবহার করতে হবে
ব্যবহারকারীর 12345

9

আমি খুঁজে পেয়েছি যে বিভিন্ন এসকিউএল সার্ভারের অস্তিত্বের জন্য এইভাবে অস্তিত্বের জন্য যাচাই করার জন্য আপনি খুব অবিশ্বাস্য এবং সোজা পদ্ধতি ব্যবহার করতে পারেন:

IF OBJECTPROPERTY (object_id('schemaname.scalarfuncname'), 'IsScalarFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.tablefuncname'), 'IsTableFunction') = 1
IF OBJECTPROPERTY (object_id('schemaname.procname'), 'IsProcedure') = 1

এটি এসকিউএল 2005+ এ উপলব্ধ ওবিজেইসিটি প্রপার্টি ফাংশনের উপর ভিত্তি করে। এমএসডিএন নিবন্ধটি এখানে পাওয়া যাবে

OBJECTPROPERTY ফাংশনটি নিম্নলিখিত স্বাক্ষর ব্যবহার করে:

OBJECTPROPERTY ( id , property ) 

আপনি সম্পত্তি প্যারামিটারে একটি আক্ষরিক মান পাস করে আপনি যে ধরণের অবজেক্টটির সন্ধান করছেন তা নির্ধারণ করে। আপনি সরবরাহ করতে পারেন এমন মানগুলির একটি বিশাল তালিকা রয়েছে।


আমি মনে করি এই উত্তরটির সরলতাটি যদি এটি সম্পূর্ণ / ড্রপ উদাহরণ অন্তর্ভুক্ত করে তবে এটি সহজ হওয়া সহজ হবে।
জোনাথন

6

আমি জানি এই থ্রেড বয়স কিন্তু আমি শুধু যারা বিশ্বাস স্থাপন করে এটি নিরাপদ এই উত্তর যোগ করতে চেয়েছিলেন Alterচেয়ে Dropএবং Create। নীচে এটি বিদ্যমান থাকলে বা এটি Alterনা Functionথাকলে এটি করবে Create:

  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
  ...

2
আমি এটি পছন্দ করি তবে আমার মনে হয় এটি "আলেটার ফাংশন" হওয়া উচিত, না?
এরিক

আমি পছন্দ করিALTER OR CREATE
এজেন্টফায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.