এটি সংরক্ষণের আগে কোনও সঞ্চিত পদ্ধতি বিদ্যমান কিনা তা পরীক্ষা করে দেখুন


283

আমার কাছে একটি এসকিউএল স্ক্রিপ্ট রয়েছে যা প্রতিবার ক্লায়েন্ট "ডাটাবেস পরিচালনা" কার্যকারিতা সম্পাদন করে। স্ক্রিপ্টে ক্লায়েন্ট ডাটাবেসে সঞ্চিত পদ্ধতি তৈরি করা অন্তর্ভুক্ত। এই ক্লায়েন্টগুলির মধ্যে কিছুগুলির মধ্যে ইতিমধ্যে স্ক্রিপ্টটি চালনার পরে সঞ্চিত প্রক্রিয়া থাকতে পারে এবং কিছু নাও থাকতে পারে। আমার ক্লায়েন্ট ডাটাবেসে হারিয়ে যাওয়া সঞ্চিত পদ্ধতিগুলি থাকা দরকার, তবে আমি টি-এসকিউএল সিনট্যাক্সটি বাঁকানোর জন্য কতটা চেষ্টা করি তা বিবেচনা করে না, আমি পাই

ক্রিয়েট / আলেটার পদ্ধতি 'একটি ক্যোয়ারী ব্যাচের প্রথম বিবৃতি হতে হবে

আমি কাজগুলি তৈরির আগে ড্রপটি পড়েছি, তবে এটি সেভাবে করা পছন্দ করি না।

IF EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND name = 'MyProc')
DROP PROCEDURE MyProc
GO

CREATE PROCEDURE MyProc
...

আমি কীভাবে একটি সঞ্চিত প্রক্রিয়াটির অস্তিত্বের জন্য চেক যুক্ত করতে পারি এবং এটি উপস্থিত না থাকলে এটি তৈরি করতে পারি তবে এটি উপস্থিত না থাকলে পরিবর্তন করতে পারি?


2
না এটি কাজ করে না, কারণ এটি একটি সঞ্চিত প্রক্রিয়া তৈরি করে যা অভিযোগ আপনি যা চান তা নয়। আমরা যা দেখতে পাচ্ছি তা থেকে এটি এটিকে ফেলে দেওয়া হয় না, সুতরাং এটি অবশ্যই শব্দটির সমস্ত ক্ষেত্রে সঞ্চিত রয়েছে stored এটা না অপ্রাসঙ্গিক কেন আপনি একটি অ সঞ্চিত পদ্ধতি প্রয়োজন
ডেভিড Hedlund

'সঞ্চিত নয়' পদ্ধতি বলতে কী বোঝ? আপনার সমস্ত নমুনা হ'ল একটি সঞ্চিত পদ্ধতি পুনরায় তৈরি করা; এটি আপনার প্রশ্নের সাথে কি করার আছে?
আকাশম

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

যতবার তারা স্ক্রিপ্টটি চালায়, এটি আবার প্রক্রিয়াটি তৈরি করার চেষ্টা করবে (দুর্ভাগ্যক্রমে, এটি সবকিছু ক্রিয়েড প্রক্রিয়া কল সহ একই .sql ফাইলে স্ক্রিপ্ট করতে হবে)। যদি বাক্য উপস্থিতি না থাকে তবে বাক্য গঠন সীমাবদ্ধতার কারণে তৈরি হয় না। আমি কি করতে পারি?
শ্যাপার

উত্তর:


199

আপনি কোয়েরি চালাতে সক্ষম যে কোনও জায়গায় প্রসেসালাল কোড চালাতে পারেন।

এর পরে কেবল সমস্ত কিছু অনুলিপি করুন AS:

BEGIN
    DECLARE @myvar INT
    SELECT  *
    FROM    mytable
    WHERE   @myvar ...
END

এই কোডটি ঠিক একই জিনিসগুলি করে যা একটি সঞ্চিত প্রকল্পটি করবে তবে এটি ডাটাবেস সাইডে সংরক্ষিত নেই।

এটি অনেকটা যেমন বেনাম পদ্ধতি বলা হয় এর মতো PL/SQL

হালনাগাদ:

আপনার প্রশ্নের শিরোনামটি কিছুটা বিভ্রান্তিকর।

আপনার যদি কেবল একটি প্রক্রিয়া তৈরি করার প্রয়োজন নেই যদি এটি না থাকে তবে আপনার কোডটি ঠিক আছে।

এখানে SSMSতৈরি স্ক্রিপ্টে কী ফলাফল রয়েছে:

IF EXISTS ( SELECT  *
            FROM    sys.objects
            WHERE   object_id = OBJECT_ID(N'myproc')
                    AND type IN ( N'P', N'PC' ) ) 
DROP 
CREATE 

হালনাগাদ:

স্কিমা সহ যখন এটি কীভাবে করা যায় তার উদাহরণ:

IF EXISTS ( SELECT * 
            FROM   sysobjects 
            WHERE  id = object_id(N'[dbo].[MyProc]') 
                   and OBJECTPROPERTY(id, N'IsProcedure') = 1 )
BEGIN
    DROP PROCEDURE [dbo].[MyProc]
END

উপরের উদাহরণে, ডিবিও হ'ল স্কিমা।

হালনাগাদ:

এসকিউএল সার্ভার 2016+ এ আপনি কেবল করতে পারেন

CREATE OR ALTER PROCEDURE dbo.MyProc


হ্যাঁ এটি সত্য, তবে কোনও প্রক্রিয়া, ইউডিএফ, দর্শন এবং এ জাতীয় কোনও কোয়েরি থেকে কল করার জন্য সংরক্ষণ করা হবে না বলে আপনি সমস্ত প্রক্রিয়াজাতীয় কার্যকারিতা looseিলা করবেন। (দুঃখিত, এটি সম্পাদনা করেছেন, এটি আমার মাথার মধ্যে X-) তা উপলব্ধি করেছে)
অ্যাড্রিয়ান স্ট্যান্ডার

1
হ্যাঁ, তবে আপনি অন্যান্য পদ্ধতির মধ্যে থেকে প্রক্রিয়াগুলিতে কল করতে পারেন বা তাদের ফিরতি কোনও টেবিলে ইনপুট হিসাবে ব্যবহার করতে পারেন।
অ্যাড্রিয়ান স্ট্যান্ডার

@astander: আপনি সঞ্চিত প্রক্রিয়া থেকেও বেনাম কোড কল করতে পারেন। একটি তাদের আউটপুট ব্যবহার করতে INSERT, আপনি ব্যবহার করতে হবে OPENROWSETবা OPENQUERYযা পাশাপাশি বেনামী কোড সাথে কাজ করে। অবশ্যই বেনামি কোডটিতে কিছু ত্রুটি রয়েছে: উদাহরণস্বরূপ, এটি কেবল কলারের সুবিধার অধীনে চলে। আমার
বক্তব্যটি হ'ল

"যদি আপনার যদি কেবল একটি প্রক্রিয়া তৈরি না করা থাকে তবে তা না থাকলে আপনার কোডটি ঠিক আছে" " এবং এটিই আমি জানতে চেয়েছিলাম। আমি আসল স্ক্রিপ্টে এসএসএমএস ক্রিয়েটটি ব্যবহার করার চেষ্টা করেছি কিন্তু এটি কোনও ভাল করতে পারেনি। তবে কাসনোইকে ধন্যবাদ, এবং অস্পষ্ট প্রশ্নের জন্য আমি দুঃখিত।
শেপার

2
ডায়নামিক এসকিউএল ব্যবহার না করার সময় একটি ক্র্যাট প্রোস বিবৃতি অবশ্যই ব্যাচের একমাত্র বিবৃতি হতে হবে যাতে এই পদ্ধতিতে প্রয়োগ করার সময় আপনি ড্রপ / ক্রিয়েটের চারপাশে কোনও লেনদেন গুটিয়ে রাখতে পারবেন না। DROP PROC কল করার পরে একটি জিও (ব্যাচ বিভাজক) থাকতে হবে।
শিব

449

আমি বুঝতে পেরেছি এটি ইতিমধ্যে উত্তর হিসাবে চিহ্নিত করা হয়েছে, তবে আমরা এটি এইভাবে ব্যবহার করতাম:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('dbo.MyProc'))
   exec('CREATE PROCEDURE [dbo].[MyProc] AS BEGIN SET NOCOUNT ON; END')
GO

ALTER PROCEDURE [dbo].[MyProc] 
AS
  ....

প্রক্রিয়া বাদ দেওয়া এড়াতে।


74
এটি কেন একটি ভাল ধারণা সে সম্পর্কে কিছু নোট যুক্ত করতে: 1) একটি ড্রপ কোনও সুরক্ষা সেটিংস সাফ করবে, 2) এইভাবে এটি করে, যদি পরিবর্তিত স্ক্রিপ্ট কোনও কারণে ব্যর্থ হয়, তবে এসপি বাদ দেওয়া হবে না।
রায়ান গিল

10
এটি সত্যই সঠিক উত্তর। এটি প্রশ্নের মধ্যে সঞ্চিত সংগ্রহের কোনও গ্রান্ট হারাতে এড়াতে পারে।
অ্যান্ডি_ভালহপ

7
এই পদ্ধতির একটি বিশাল সুবিধা রয়েছে যে সঞ্চিত প্রক্রিয়াটি বিদ্যমান না থাকলে সময়ে কোনও পয়েন্ট নেই। আপডেটটি একটি সমালোচনামূলক সিস্টেমে প্রয়োগ করা হয় যখন এটি এখনও অন্য ব্যক্তি, সিস্টেম বা থ্রেডের দ্বারা ব্যবহৃত হয় তবে এটি গুরুত্বপূর্ণ। মুহুর্তে কোনও সঞ্চিত প্রক্রিয়া বাদ দেওয়ার ফলে ঘটে যাওয়া ত্রুটিগুলি সন্ধান করা যথেষ্ট উদ্বেগজনক হতে পারে কারণ এগুলি পুনরুত্পাদন করা খুব কঠিন।
জেমস

3
এটি ইতিমধ্যে উল্লিখিত বিভিন্ন কারণে এটির একটি দুর্দান্ত সমাধান এবং আমি কেবল এটি যুক্ত করতে চাই, যদি ডিবিএরা প্রোটা মেটা-ডেটা (যেমন তৈরি-তারিখ) এর উপর নির্ভর করে, তবে প্র্যাকটি তৈরির পরিবর্তে এই জিনিসটি অক্ষত থাকবে প্রতিবার নতুন। আমি আমাদের নিজস্ব প্রকল্পগুলি বজায় রাখার জন্য এটি আমার দলের "সেরা অনুশীলনে" পরিণত করার চেষ্টা করছি, যা সাধারণত বেশিরভাগ ডিবিতে অনুলিপি / প্রচার করতে হয়।
নাতেজে

2
এছাড়াও বিবেচনা যে কিছু লোক চানGRANT লিপিতে বিবৃতি সুনির্দিষ্টভাবে ক্ষেত্রে তারা পরিবর্তন ; সুতরাং DROPপরিবর্তে ব্যবহার করার ন্যায্যতা আছে ALTER
কোডি স্টট

123

যদি আপনি এটি সরিয়ে নেওয়ার আগে কোনও ডাটাবেস অবজেক্টের অস্তিত্বের জন্য যাচাই করার সহজ উপায়টি সন্ধান করেন তবে এখানে একটি উপায় রয়েছে (উদাহরণস্বরূপ একটি স্প্রোক ব্যবহার করা হয়েছে, যেমন উপরের উদাহরণগুলির মতো তবে টেবিল, সূচিপত্র ইত্যাদির জন্য পরিবর্তন করা যেতে পারে ...):

IF (OBJECT_ID('MyProcedure') IS NOT NULL)
  DROP PROCEDURE MyProcedure
GO

এটি দ্রুত এবং মার্জিত, তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সমস্ত বস্তুর জন্য আপনার অনন্য অবজেক্টের নাম রয়েছে কারণ এটি এটিকে বিবেচনায় নেয় না।

আশা করি এটা কাজে লাগবে!


62
এটি আরও ভাল: IF (OBJECT_ID ('মাইপ্রসেসিউডার', 'পি') নিখুঁত নয়) ড্রপ প্রক্রিয়া মাইপ্রসেসর যান
অ্যালারি

33

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

IF OBJECT_ID('MyProcedure', 'P') IS NOT NULL
    DROP PROCEDURE MyProcedure
GO

দ্বিতীয় প্যারামিটারটি বলে OBJECT_ID কেবলমাত্র এমন বস্তুর সন্ধান করতেobject_type = 'P' , যা সঞ্চিত পদ্ধতি:

এএফ = সমষ্টি ফাংশন (সিএলআর)

সি = চেক সীমাবদ্ধতা

ডি = ডিফল্ট (বাধা বা একা একা)

F = বিদেশী কী বাধা

এফএন = এসকিউএল স্কেলার ফাংশন

FS = সমাবেশ (সিএলআর) স্কেলার-ফাংশন

এফটি = সমাবেশ (সিএলআর) সারণী-মূল্যবান ফাংশন

আইএফ = এসকিউএল ইনলাইন টেবিলের মূল্যবান ফাংশন

আইটি = অভ্যন্তরীণ সারণী

পি = এসকিউএল সঞ্চিত পদ্ধতি

পিসি = সমাবেশ (সিএলআর) সঞ্চিত-পদ্ধতি

পিজি = প্ল্যান গাইড

পিকে = প্রাথমিক মূল সীমাবদ্ধতা

আর = বিধি (পুরানো শৈলী, একা একা)

আরএফ = প্রতিলিপি-ফিল্টার-পদ্ধতি

এস = সিস্টেম বেস টেবিল

এসএন = প্রতিশব্দ

SO = সিকোয়েন্স অবজেক্ট

টিএফ = এসকিউএল সারণী-মূল্যবান ফাংশন

টিআর = ট্রিগার

আপনি এর মাধ্যমে বিকল্পগুলির সম্পূর্ণ তালিকা পেতে পারেন:

SELECT name 
FROM master..spt_values
WHERE type = 'O9T'

1
টিএফ অনুপস্থিত। তবুও, এই তালিকা সরবরাহের জন্য +1
ক্রোনো

ট্রিগারটির জন্য টিআর
কার্লোসরো


23

আমি জানি এটি একটি খুব পুরানো পোস্ট, তবে যেহেতু এটি শীর্ষ অনুসন্ধানের ফলাফলগুলিতে প্রদর্শিত হয় তাই এসকিউএল সার্ভার 2016 এসপি 1 ব্যবহারকারীদের জন্য সর্বশেষ আপডেট যুক্ত করে -

create or alter procedure procTest
as
begin
 print (1)
end;
go

এটি ইতিমধ্যে বিদ্যমান না থাকলে এটি একটি সঞ্চিত প্রক্রিয়া তৈরি করে, তবে উপস্থিত থাকলে এটি পরিবর্তন করে।

উল্লেখ


1
এটি তাই, তাই দরকারী।
এজেন্টফায়ার

আমি কেবল এসকিউএল স্টুডিওতে এটির জন্য কাজ করতে জোর দিতে চাই - একটি স্কিল ফাইলে এটি আমার জন্য ব্যর্থ।
জেমস এল।

10

ড্রপ যদি বিদ্যমান থাকে এসকিউএল সার্ভার 2016 এর একটি নতুন বৈশিষ্ট্য

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

DROP  PROCEDURE IF EXISTS dbo.[procname]

1
এটি স্কেল সার্ভার সিনট্যাক্স নয় ..., ছেলেরা ডাউনভোটিং শুরু করার আগে উত্তর সরিয়ে দেওয়ার এবং নতুনদের জন্য বিভ্রান্তি এড়ানোর পরামর্শ advice
পাভেল জাজ্পস্কি

@ পাওয়েলসিজেড এটি এসকিউএল সার্ভার ২০১ valid এবং এর জন্য বৈধ, আমি উত্তরটি সন্ধান করেছি। সাহায্য করার জন্য ধন্যবাদ!
জয়জেয়

এটি মূল পোস্টের উত্তর দেয় না। স্বয়ংক্রিয়ভাবে নামা এবং পুনরুদ্ধার এবং এটির অস্তিত্ব না থাকলে কেবল তৈরির মধ্যে সূক্ষ্ম পার্থক্য রয়েছে। একটি প্রকোপ ফেলে দেওয়া এর সাথে সম্পর্কিত সুরক্ষা ছেড়ে দেবে, যা স্ক্রিপ্ট করা হতে পারে।
রন

7

আমারও ত্রুটি ছিল আমি জানি এই থ্রেডটি ইতিমধ্যে বেশ মরে গেছে তবে আমি "বেনামে পদ্ধতি" ছাড়াও অন্য একটি বিকল্প সেট করতে চাই।

আমি এটি এর মতো সমাধান করেছি:

  1. সঞ্চিত পদ্ধতিটি বিদ্যমান কিনা তা পরীক্ষা করুন:

    IF NOT EXISTS (SELECT * FROM sysobjects WHERE name='my_procedure') BEGIN
        print 'exists'  -- or watever you want
    END ELSE BEGIN
        print 'doesn''texists'   -- or watever you want
    END
  2. তবে "CREATE/ALTER PROCEDURE' must be the first statement in a query batch"এখনও আছে। আমি এটি এর মতো সমাধান করেছি:

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE -- view procedure function or anything you want ...
  3. আমি এই কোডটি দিয়ে শেষ করছি:

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID('my_procedure'))
    BEGIN
        DROP PROCEDURE my_procedure
    END
    
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    CREATE PROCEDURE [dbo].my_procedure ...

আপনার যদি সূচনা প্রক্রিয়ার মতো কোডের 1 লাইনই না থাকে তবে আপনার শুরু এবং শেষের দরকার নেই ...
ফিলিপ সেন

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

আরও ভাল বিকল্প: যদি উপস্থিত থাকে (1 টি সিস.প্রসেসর থেকে 1 টি নির্বাচন করুন যেখানে নাম = 'নাম_ওফেটেবল_সেসেন_ইন_সিসপ্রসেসস') শুরু করুন -1 'স্ট্যাটাস' এন্ডের হিসাবে নির্বাচন করুন
রায়ান ব্যাটিস্টোন

5

এখানে এই পদ্ধতিটি ব্যবহার করার পিছনে একটি পদ্ধতি এবং কিছু যুক্তি রয়েছে। সঞ্চিত প্রকোপটি সম্পাদনা করা তেমন সুন্দর নয় তবে এখানে বিভিন্ন উপকারিতা এবং ...

আপডেট: আপনিও এই পুরো কলটিকে একটি ট্রান্সঅ্যাকশনে মোড়াতে পারেন। একক লেনদেনে অনেকগুলি সঞ্চিত প্রক্রিয়া অন্তর্ভুক্ত যা সমস্ত কমিট বা সমস্ত রোলব্যাক করতে পারে। লেনদেনের মোড়কের আরেকটি সুবিধা হ'ল স্ট্রাকড পদ্ধতিটি অন্যান্য এসকিউএল সংযোগের জন্য সর্বদা উপস্থিত থাকে যতক্ষণ না তারা রিড ইউএনসিএমইটিড লেনদেনের বিচ্ছিন্নতা স্তরটি ব্যবহার না করে!

1) ঠিক একটি প্রক্রিয়া সিদ্ধান্ত হিসাবে পরিবর্তন এড়ানোর জন্য। আমাদের প্রক্রিয়াগুলি সর্বদা উপস্থিত থাকে যদি ততক্ষণে তৈরি হয়। আপনি যদি নতুন প্রোসিকে পছন্দসই প্রকল্প হিসাবে ধরে নেওয়ার একই প্যাটার্নটি করেন তবে অল্টার্সের জন্য খাদ্য সরবরাহ করা কিছুটা কঠিন কারণ আপনার যদি অন্য সব কিছু তৈরি না করে থাকে।

২) আপনাকে ব্যাচের প্রথম কল হিসাবে ক্রিয়েট / অলটার স্থাপন করতে হবে যাতে আপনি গতিশীল এসকিউএল এর বাইরে কোনও লেনদেনের পদ্ধতি আপডেটের ক্রমটি মোড়তে না পারেন। মূলত আপনি যদি ডিবি ব্যাকআপটি পুনরুদ্ধার না করে প্রক্রিয়া আপডেটের পুরো স্ট্যাক চালাতে চান বা সেগুলি আবার ফিরিয়ে দিতে চান তবে এটি একক ব্যাচে সমস্ত কিছু করার উপায়।

IF NOT EXISTS (select ss.name as SchemaName, sp.name as StoredProc 
    from sys.procedures sp
    join sys.schemas ss on sp.schema_id = ss.schema_id
    where ss.name = 'dbo' and sp.name = 'MyStoredProc')
BEGIN
    DECLARE @sql NVARCHAR(MAX)

    -- Not so aesthetically pleasing part. The actual proc definition is stored
    -- in our variable and then executed.
    SELECT @sql = 'CREATE PROCEDURE [dbo].[MyStoredProc]
(
@MyParam int
)
AS
SELECT @MyParam'
    EXEC sp_executesql @sql
END

5

২০০৮ এর পর থেকে SQL সার্ভারে, আপনি " INFORMATION_SCHEMA.ROUTINES" ব্যবহার করতে পারেন

IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.ROUTINES 
  WHERE ROUTINE_NAME = 'MySP'
        AND ROUTINE_TYPE = 'PROCEDURE') 

3

স্পষ্টতই আমার কাছে ভোট দেওয়ার বা মন্তব্য করার খ্যাতি নেই, তবে আমি কেবল এটিই বলতে চেয়েছিলাম যে এক্সক (এসপি_সেকুটস্কেল আরও ভাল হতে পারে) ব্যবহার করে জেফের উত্তর অবশ্যই যাওয়ার উপায়। সরিয়ে ফেলা এবং তারপরে পুনরায় তৈরি করার পরে সঞ্চিত প্রক্রিয়াটি শেষ হয়ে যায়, তবে সময়ের মধ্যে এমন একটি মুহুর্ত রয়েছে যেখানে সঞ্চিত প্রক্রিয়াটি মোটেই বিদ্যমান নেই এবং এটি খুব খারাপ হতে পারে, বিশেষত যদি এটি এমন কিছু হয় যা হবে বারবার চালানো। আমার অ্যাপ্লিকেশনটিতে আমার কাছে সমস্ত ধরণের সমস্যা ছিল কারণ একটি পটভূমি থ্রেড একটি আইফোন উপস্থিত থাকলে ... একই সময়ে তৈরি করুন অন্য থ্রেড সঞ্চিত পদ্ধতিটি ব্যবহার করার চেষ্টা করছে।


3

** টি-এসকিএল-তে সঞ্চিত সংগ্রহটি ড্রপ এবং পুনরায় তৈরি করার সহজ উপায় হ'ল **

Use DatabaseName
go
If Object_Id('schema.storedprocname') is not null
begin
   drop procedure schema.storedprocname
end
go

create procedure schema.storedprocname
as

begin
end

3

আমি যে স্ক্রিপ্টটি ব্যবহার করি তা এখানে। এটির সাথে, আমি অকারণে সঞ্চিত প্রকোপগুলি বাদ দেওয়া এবং পুনরায় পুনরুদ্ধার করা এড়াতে চাই।

IF NOT EXISTS (
    SELECT *
    FROM sys.objects
    WHERE object_id = OBJECT_ID(N'[dbo].[uspMyProcedure]')
    )
BEGIN
  EXEC sp_executesql N'CREATE PROCEDURE [dbo].[uspMyProcedure] AS select 1'
END
GO

ALTER PROCEDURE [dbo].[uspMyProcedure] 
    @variable1 INTEGER  
AS
BEGIN
   -- Stored procedure logic
END

2

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

IF EXISTS (SELECT * FROM sys.objects 
            WHERE object_id = OBJECT_ID
             (N'[Schema].[Procedure_Name]') AND type IN (N'P', N'PC'))
BEGIN
       DROP PROCEDURE [Schema].[Procedure_Name]
       Print('Proceudre dropped => [Schema].[Procedure_Name]')
END

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


1

আপনি কেন সরল পথে যান না

    IF EXISTS(SELECT * FROM sys.procedures WHERE NAME LIKE 'uspBlackListGetAll')
    BEGIN
         DROP PROCEDURE uspBlackListGetAll
    END
    GO

    CREATE Procedure uspBlackListGetAll

..........


এখানে LIKE% বিবৃতি ব্যবহার করা খারাপ ধারণা। যদি ওপিতে ইউএসপ্লে্যাকলিস্টগেটল_ভ ২ এর মতো অন্য কোনও স্প্রোক থাকে যে তারা বাদ পড়তে চায় না?
ডেভ হোগান

@ ডেভহোগান আমি সম্মত তবে সে একটি রাখেনি %, তাই LIKEহিসাবে আচরণ করে=
ডিয়েগো জ্যানিক

1
@ ডিগো জ্যানসিক যদি আপনি সম্পাদিত ইতিহাসের দিকে লক্ষ্য করেন তবে আপনি দেখতে পাবেন এটি মূলত একটি '%' নিয়ে ছিল
ডেভ হোগান

0

উত্তর ছাড়াও @ জিওফের আমি একটি সাধারণ সরঞ্জাম তৈরি করেছি যা একটি এসকিউএল-ফাইল উত্পন্ন করে যা স্টোরেড পদ্ধতি, ভিউ, ফাংশন এবং ট্রিগারগুলির বিবৃতি দেয়।

দেখুন MyDbUtils @ CodePlexএখানে চিত্র বর্ণনা লিখুন


1
আমি মনে করি ম্যানেজমেন্ট স্টুডিও ইতিমধ্যে এ জাতীয় সরঞ্জাম দেয়। এটিকে "স্ক্রিপ্টগুলি উত্পন্ন করুন"
হাইব্রিস 95

0

আমি অবাক! আমি কেন পুরো কোয়েরিটি লিখি না

GO
create procedure [dbo].[spAddNewClass] @ClassName varchar(20),@ClassFee int
as
begin
insert into tblClass values (@ClassName,@ClassFee)
end

GO
create procedure [dbo].[spAddNewSection] @SectionName varchar(20),@ClassID       int
as
begin
insert into tblSection values(@SectionName,@ClassID)
end

Go
create procedure test
as
begin 
select * from tblstudent
end

আমি ইতিমধ্যে জানি যে প্রথম দুটি পদ্ধতি ইতিমধ্যে বিদ্যমান আছে বর্গ কোয়ারিটি চলবে প্রথম দুটি পদ্ধতির ত্রুটিটি দেবে কিন্তু তবুও এটি শেষ পদ্ধতি তৈরি করবে এসকিউএল নিজেই ইতিমধ্যে যা উপস্থিত রয়েছে তার যত্ন নিচ্ছে এটিই আমি সবসময় আমার সমস্ত কাজ করি ক্লায়েন্ট!


-2

প্রক্রিয়াটি তৈরি করুন যদি 'আপনার প্রকৃত নাম' () শুরু না হয় ... শেষ হয়


প্রক্রিয়া বিদ্যমান থাকলে এটি কিছুই করবে না। অনুরোধকারী উপস্থিত থাকলে পদ্ধতিটি পরিবর্তন করতে চায়, যদি না থাকে তবে এটি তৈরি করুন।
রেন্ডি গ্যামেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.