এসএসকিউএল কল স্টোরড পদ্ধতিটি প্রতিটি সারিটির জন্য কার্সার ব্যবহার না করে


163

কোনও সারণীর প্রতিটি সারিটির জন্য কীভাবে কোনও সঞ্চিত প্রক্রিয়া কল করতে পারে, যেখানে কোনও সারির কলামগুলি কোনও কার্সার ব্যবহার না করেই এসপিতে ইনপুট পরামিতি হয় ?


3
সুতরাং, উদাহরণস্বরূপ, আপনার কাছে গ্রাহকআইডি কলাম সহ গ্রাহক টেবিল রয়েছে এবং আপনি টেবিলের প্রতিটি সারির জন্য এসপি একবার কল করতে চান, সংশ্লিষ্ট গ্রাহককে পরামিতি হিসাবে পাস করে?
গ্যারি ম্যাকগিল

2
আপনি কেন কার্সারটি ব্যবহার করতে পারবেন না তা ব্যাখ্যা করতে পারেন?
Andomar

@ গ্যারি: সম্ভবত আমি কেবল গ্রাহকের নামটিই পাস করতে চাই, প্রয়োজনীয় আইডি নয় not তবে আপনি ঠিক বলেছেন।
জোহানেস রুডল্ফ

2
@ অ্যান্ডোমার: খাঁটি বৈজ্ঞানিক :-)
জোহানেস রুডল্ফ

1
এই সমস্যাটি আমাকে খুব বড় করে তোলে।
ড্যানিয়েল

উত্তর:


200

সাধারণভাবে বলতে গেলে আমি সর্বদা একটি সেট ভিত্তিক পদ্ধতির সন্ধান করি (কখনও কখনও স্কিমা পরিবর্তন করার ব্যয়ে)।

যাইহোক, এই স্নিপেট এর নিজস্ব জায়গা আছে ..

-- Declare & init (2008 syntax)
DECLARE @CustomerID INT = 0

-- Iterate over all customers
WHILE (1 = 1) 
BEGIN  

  -- Get next customerId
  SELECT TOP 1 @CustomerID = CustomerID
  FROM Sales.Customer
  WHERE CustomerID > @CustomerId 
  ORDER BY CustomerID

  -- Exit loop if no more customers
  IF @@ROWCOUNT = 0 BREAK;

  -- call your sproc
  EXEC dbo.YOURSPROC @CustomerId

END

21
স্বীকৃত উত্তরের সাথে সাথেই কেশনের সাথে ব্যবহার করুন: আপনার টেবিল এবং সূচকের কাঠামোর উপর নির্ভর করে এটি খুব খারাপভাবে সম্পাদন করতে পারে (ও (এন ^ 2)) যেহেতু আপনি প্রতিবার আপনার টেবিলটি অর্ডার করতে এবং অনুসন্ধান করতে হবে।
csauve

3
এটি কাজ করে বলে মনে হচ্ছে না (বিরতি আমার জন্য কখনই লুপ থেকে বের হয় না - কাজটি শেষ হয়েছে তবে ক্যোরিটি লুপে স্পিন করে)। আইডি শুরু করা এবং নালটির জন্য পরীক্ষা করা শর্তটি লুপ থেকে বেরিয়ে আসে।
dudeNumber4

8
@@ ROWCOUNT টি একবারে পড়তে পারে। এমনকি যদি আইএফ / প্রিন্টের স্টেটমেন্টগুলি এটি 0 এ সেট করে @@ @ ROWCOUNT এর জন্য পরীক্ষার পরে 'তাত্ক্ষণিক' পরীক্ষা করতে হবে। আমি আপনার কোড / পরিবেশ পুনরায় পরীক্ষা করব। টেকনেট.মাইক্রোসফট.ইন- ইউএস
মার্ক পাওয়েল

3
: লুপ এক্সিকিউটেবল-এর পাথ বেশী ভালো না হলেও সতর্কতা অবলম্বন করা আবশ্যক, তারা এমনকি খারাপ হতে পারে techrepublic.com/blog/the-enterprise-cloud/...
জেইমি

1
@ ব্রেনান পোপ একটি কর্সারের জন্য স্থানীয় বিকল্পটি ব্যবহার করুন এবং ব্যর্থতার পরে এটি ধ্বংস হয়ে যাবে। LOCAL FAST_FORWARD ব্যবহার করুন এবং এই জাতীয় লুপগুলির জন্য CURSOR ব্যবহার না করার প্রায় শূন্য কারণ রয়েছে। এটি অবশ্যই এই WHOL লুপকে ছাড়িয়ে যাবে।
মার্টিন

39

আপনি এর মতো কিছু করতে পারেন: যেমন আপনার টেবিলটি অর্ডার করুন গ্রাহকআইডি (অ্যাডভেঞ্চার ওয়ার্কস Sales.Customerনমুনা টেবিল ব্যবহার করে ), এবং WHIP লুপ ব্যবহার করে সেই গ্রাহকদের উপর পুনরাবৃত্তি করুন:

-- define the last customer ID handled
DECLARE @LastCustomerID INT
SET @LastCustomerID = 0

-- define the customer ID to be handled now
DECLARE @CustomerIDToHandle INT

-- select the next customer to handle    
SELECT TOP 1 @CustomerIDToHandle = CustomerID
FROM Sales.Customer
WHERE CustomerID > @LastCustomerID
ORDER BY CustomerID

-- as long as we have customers......    
WHILE @CustomerIDToHandle IS NOT NULL
BEGIN
    -- call your sproc

    -- set the last customer handled to the one we just handled
    SET @LastCustomerID = @CustomerIDToHandle
    SET @CustomerIDToHandle = NULL

    -- select the next customer to handle    
    SELECT TOP 1 @CustomerIDToHandle = CustomerID
    FROM Sales.Customer
    WHERE CustomerID > @LastCustomerID
    ORDER BY CustomerID
END

এটি যে কোনও টেবিলে কাজ করা উচিত যতক্ষণ না আপনি ORDER BYকোনও কলামে কোনও ধরণের সংজ্ঞা দিতে পারেন ।


@ মিচ: হ্যাঁ, সত্য - কিছুটা ওভারহেড। তবে এখনও - এটি এসকিউএল-এর সেট-ভিত্তিক মানসিকতায় আসলেই নেই
মার্ক 12 ই

6
একটি সেট ভিত্তিক বাস্তবায়ন কি এমনকি সম্ভব?
জোহানেস রুডল্ফ

আমি এটি অর্জনের কোনও উপায় জানি না, সত্যই - এটি শুরু করা খুব প্রক্রিয়াজাতীয় কাজ ....
marc_s

2
@marc_s একটি সংগ্রহে প্রতিটি আইটেমের জন্য একটি ফাংশন / স্টোরপ্রসিসিওর কার্যকর করে, এটি সেট ভিত্তিক ক্রিয়াকলাপের রুটি এবং মাখনের মতো মনে হয়। তাদের প্রত্যেকের ফলাফল না পেয়ে সম্ভবত সমস্যা দেখা দিয়েছে। বেশিরভাগ কার্যকরী প্রোগ্রামিং ভাষায় "মানচিত্র" দেখুন।
ড্যানিয়েল

4
Re: ড্যানিয়েল। হ্যাঁ একটি ফাংশন, একটি সঞ্চিত পদ্ধতি নং। সংজ্ঞা অনুসারে একটি সঞ্চিত পদ্ধতিতে পার্শ্ব প্রতিক্রিয়া থাকতে পারে এবং কোয়েরিতে পার্শ্ব প্রতিক্রিয়া অনুমোদিত নয়। একইভাবে, কার্যকরী ভাষায় একটি যথাযথ "মানচিত্র" পার্শ্ব প্রতিক্রিয়া নিষিদ্ধ করে।
csauve

28
DECLARE @SQL varchar(max)=''

-- MyTable has fields fld1 & fld2

Select @SQL = @SQL + 'exec myproc ' + convert(varchar(10),fld1) + ',' 
                   + convert(varchar(10),fld2) + ';'
From MyTable

EXEC (@SQL)

ঠিক আছে, তাই আমি কখনও এই জাতীয় কোড উত্পাদন করতে না, কিন্তু এটি আপনার প্রয়োজনীয়তা পূরণ করে।


পদ্ধতিটি যখন সারি মান নির্ধারণ করে এমন একটি মান ফেরত দেয় তখন একই জিনিস কীভাবে করবেন? (কোনও ফাংশনের পরিবর্তে একটি প্রক্রিয়া ব্যবহার করা কারণ ফাংশন তৈরির অনুমতি নেই )
ব্যবহারকারী 2284570

@ ওয়েইহুইগুও কারণ স্ট্রিংগুলি ব্যবহার করে কোডটি গতিশীলভাবে নির্মিত কোডটি হ'ল হ্রাসযুক্ত ব্যর্থতার ঝুঁকি এবং ডিবাগের জন্য বাটে মোট ব্যথা। উত্পাদনের পরিবেশের রুটিন অংশ হওয়ার কোনও সম্ভাবনা নেই এমন একের বাইরে আপনার কখনই এমন কিছু করা উচিত নয়
মেরি

11

মার্কের উত্তরটি ভাল (আমি কীভাবে এটি করতে পারি তা যদি আমি এটিতে মন্তব্য করব!)
কেবল ভেবেছিলাম আমি উল্লেখ করতে পারি যে লুপটি পরিবর্তন করা ভাল তবে SELECTকেবলমাত্র একবারেই উপস্থিত রয়েছে (সত্যিকারের ক্ষেত্রে যেখানে আমার দরকার ছিল এটি করুন, এটি SELECTবেশ জটিল ছিল এবং এটি দু'বার লেখা একটি ঝুঁকিপূর্ণ রক্ষণাবেক্ষণের সমস্যা ছিল)।

-- define the last customer ID handled
DECLARE @LastCustomerID INT
SET @LastCustomerID = 0
-- define the customer ID to be handled now
DECLARE @CustomerIDToHandle INT
SET @CustomerIDToHandle = 1

-- as long as we have customers......    
WHILE @LastCustomerID <> @CustomerIDToHandle
BEGIN  
  SET @LastCustomerId = @CustomerIDToHandle
  -- select the next customer to handle    
  SELECT TOP 1 @CustomerIDToHandle = CustomerID
  FROM Sales.Customer
  WHERE CustomerID > @LastCustomerId 
  ORDER BY CustomerID

  IF @CustomerIDToHandle <> @LastCustomerID
  BEGIN
      -- call your sproc
  END

END

অ্যাপ্লিকেশনটি কেবলমাত্র ফাংশনগুলির সাথেই ব্যবহার করা যেতে পারে ... সুতরাং আপনি যদি ফাংশনগুলি করতে না চান তবে এই পদ্ধতিটি আরও ভাল।
মধ্যে Artur

মন্তব্য করতে আপনার 50 টি reps প্রয়োজন। সেই প্রশ্নের উত্তর রাখুন এবং আপনি আরো ক্ষমতা পাবেন: D: stackoverflow.com/help/privileges
SvendK

আমি মনে করি এটি উত্তর, সরল এবং সোজা সামনে হওয়া উচিত। আপনাকে অনেক ধন্যবাদ!
বোমা মত

7

আপনি যদি সঞ্চিত পদ্ধতিটিকে কোনও ফাংশনে পরিণত করতে পারেন যা কোনও টেবিল ফেরত দেয় তবে আপনি ক্রস-প্রয়োগ ব্যবহার করতে পারেন।

উদাহরণস্বরূপ, বলুন যে আপনার কাছে গ্রাহকদের একটি টেবিল রয়েছে এবং আপনি তাদের অর্ডারের যোগফলটি গণনা করতে চান, আপনি একটি ফাংশন তৈরি করবেন যা গ্রাহকআইডি গ্রহণ করে এবং যোগফলটি ফেরত দেয়।

এবং আপনি এটি করতে পারেন:

SELECT CustomerID, CustomerSum.Total

FROM Customers
CROSS APPLY ufn_ComputeCustomerTotal(Customers.CustomerID) AS CustomerSum

যেখানে ফাংশনটি দেখতে হবে:

CREATE FUNCTION ComputeCustomerTotal
(
    @CustomerID INT
)
RETURNS TABLE
AS
RETURN
(
    SELECT SUM(CustomerOrder.Amount) AS Total FROM CustomerOrder WHERE CustomerID = @CustomerID
)

স্পষ্টতই, উপরের উদাহরণটি একটি একক ক্যোয়ারিতে কোনও ব্যবহারকারী সংজ্ঞায়িত ফাংশন ছাড়াই করা যেতে পারে।

ত্রুটিটি হ'ল ফাংশনগুলি খুব সীমাবদ্ধ - একটি সঞ্চিত পদ্ধতির অনেকগুলি বৈশিষ্ট্য কোনও ব্যবহারকারী-সংজ্ঞায়িত ফাংশনে পাওয়া যায় না এবং সঞ্চিত পদ্ধতিটিকে কোনও ফাংশনে রূপান্তর করা সবসময় কাজ করে না।


ক্ষেত্রে কোন ফাংশন তৈরির জন্য লেখার অনুমতি নেই?
ব্যবহারকারী 2284570

7

আমি স্বীকৃত উত্তরটি ব্যবহার করব, তবে অন্য সম্ভাবনাটি হ'ল একটি টেবিল ভেরিয়েবল ব্যবহার করে মানগুলির একটি সংখ্যক সেট ধরে রাখতে (এই ক্ষেত্রে কেবল কোনও টেবিলের আইডি ক্ষেত্র) এবং টেবিলের সাথে একটি JOIN সহ র নাম্বার দ্বারা লুপ করুন লুপের মধ্যে ক্রিয়াটির জন্য আপনার যা প্রয়োজন তা পুনরুদ্ধার করুন।

DECLARE @RowCnt int; SET @RowCnt = 0 -- Loop Counter

-- Use a table variable to hold numbered rows containg MyTable's ID values
DECLARE @tblLoop TABLE (RowNum int IDENTITY (1, 1) Primary key NOT NULL,
     ID INT )
INSERT INTO @tblLoop (ID)  SELECT ID FROM MyTable

  -- Vars to use within the loop
  DECLARE @Code NVarChar(10); DECLARE @Name NVarChar(100);

WHILE @RowCnt < (SELECT COUNT(RowNum) FROM @tblLoop)
BEGIN
    SET @RowCnt = @RowCnt + 1
    -- Do what you want here with the data stored in tblLoop for the given RowNum
    SELECT @Code=Code, @Name=LongName
      FROM MyTable INNER JOIN @tblLoop tL on MyTable.ID=tL.ID
      WHERE tl.RowNum=@RowCnt
    PRINT Convert(NVarChar(10),@RowCnt) +' '+ @Code +' '+ @Name
END

এটি আরও ভাল কারণ এটি আপনার পূর্বের মানটি ধরে নেয় না বা সংবেদনশীলভাবে তুলনা করা যায়।
ফিলিপ

ঠিক আমি খুঁজছেন ছিল কি.
রায়থলিন

6

এসকিউএল সার্ভার 2005 এর পরে, আপনি ক্রস প্রয়োগ এবং একটি টেবিল-মূল্যবান ফাংশন দিয়ে এটি করতে পারেন।

কেবল স্পষ্টতার জন্য, আমি সেই সব ক্ষেত্রে উল্লেখ করছি যেখানে সঞ্চিত পদ্ধতিটি একটি টেবিলের মূল্যবান ফাংশনে রূপান্তর করা যায়।


12
দুর্দান্ত ধারণা, তবে একটি ফাংশন কোনও সঞ্চিত প্রক্রিয়া কল করতে পারে না
Andomar

3

এটি উপরে n3rds সমাধানের একটি প্রকরণ। অর্ডার বাই ব্যবহার করে কোনও বাছাইয়ের দরকার নেই, যেমনটি এমআইএন () ব্যবহৃত হয়।

মনে রাখবেন গ্রাহকআইডিএইড (বা আপনি অগ্রগতির জন্য অন্যান্য যে কোনও সংখ্যাসূচক কলামটি ব্যবহার করেন) এর অবশ্যই একটি অনন্য বাধা থাকতে হবে। তদ্ব্যতীত, এটিকে যত তাড়াতাড়ি সম্ভব করার জন্য গ্রাহকআইডিকে সূচিযুক্ত করতে হবে।

-- Declare & init
DECLARE @CustomerID INT = (SELECT MIN(CustomerID) FROM Sales.Customer); -- First ID
DECLARE @Data1 VARCHAR(200);
DECLARE @Data2 VARCHAR(200);

-- Iterate over all customers
WHILE @CustomerID IS NOT NULL
BEGIN  

  -- Get data based on ID
  SELECT @Data1 = Data1, @Data2 = Data2
    FROM Sales.Customer
    WHERE [ID] = @CustomerID ;

  -- call your sproc
  EXEC dbo.YOURSPROC @Data1, @Data2

  -- Get next customerId
  SELECT @CustomerID = MIN(CustomerID)
    FROM Sales.Customer
    WHERE CustomerID > @CustomerId 

END

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


2

যদি আপনি কোন কার্সার ব্যবহার না করেন তবে আমার মনে হয় আপনাকে এটি বাহ্যিকভাবে করতে হবে (টেবিলটি পান এবং তারপরে প্রতিটি বিবৃতিতে চালনা করুন এবং প্রত্যেকবার এসপি কল করুন) এটি কার্সার ব্যবহারের মতো, তবে কেবল বাইরে এসকিউএল। আপনি কার্সার ব্যবহার করবেন না কেন?


2

এটি ইতিমধ্যে সরবরাহ করা জবাবগুলির মধ্যে একটি প্রকরণ, তবে এটি আরও ভাল করে সম্পাদন করা উচিত কারণ এর জন্য অর্ডার, COUNT বা MIN / MAX প্রয়োজন হয় না। এই পদ্ধতির সাথে একমাত্র অসুবিধা হ'ল আপনাকে সমস্ত আইডি ধরে রাখতে একটি টেম্প টেবিল তৈরি করতে হবে (ধারণাটি হ'ল গ্রাহক আইডিগুলির তালিকায় আপনার ফাঁক রয়েছে)।

এটি বলেছিল, আমি @ মারক পাওেলের সাথে একমত, যদিও সাধারণভাবে বলা যায়, একটি সেট ভিত্তিক পদ্ধতিটি আরও ভাল হওয়া উচিত।

DECLARE @tmp table (Id INT IDENTITY(1,1) PRIMARY KEY NOT NULL, CustomerID INT NOT NULL)
DECLARE @CustomerId INT 
DECLARE @Id INT = 0

INSERT INTO @tmp SELECT CustomerId FROM Sales.Customer

WHILE (1=1)
BEGIN
    SELECT @CustomerId = CustomerId, @Id = Id
    FROM @tmp
    WHERE Id = @Id + 1

    IF @@rowcount = 0 BREAK;

    -- call your sproc
    EXEC dbo.YOURSPROC @CustomerId;
END

1

বেশ কয়েকটি সারি যখন আমি সাধারণত এটি করি তখন:

  1. এসকিউএল ম্যানেজমেন্ট স্টুডিও সহ একটি ডেটাসেটে সমস্ত স্প্রোক পরামিতি নির্বাচন করুন
  2. ডান ক্লিক করুন -> অনুলিপি করুন
  3. এক্সেল করতে আটকান
  4. একটি নতুন এক্সেল কলামে '= "এক্সইসি স্কিমা.মাইসপ্রোক @ প্যারাম =" এবং এ 2 "এর মতো সূত্র সহ একক-সারি স্কেল স্টেটমেন্ট তৈরি করুন। (যেখানে A2 প্যারামিটার সহ আপনার এক্সেল কলাম রয়েছে)
  5. এসকিউএল ম্যানেজমেন্ট স্টুডিওতে এক্সেল স্টেটমেন্টগুলির একটি নতুন ক্যোয়ারিতে তালিকাটি অনুলিপি করুন এবং কার্যকর করুন।
  6. সম্পন্ন.

(বৃহত্তর ডেটাসেটে আমি উপরে উল্লিখিত সমাধানগুলির মধ্যে একটি ব্যবহার করব)।


4
প্রোগ্রামিং পরিস্থিতিতে খুব কার্যকর নয়, এটি একটি অফ-হ্যাক।
ওয়ারেন পি

1

DELIMITER //

CREATE PROCEDURE setFakeUsers (OUT output VARCHAR(100))
BEGIN

    -- define the last customer ID handled
    DECLARE LastGameID INT;
    DECLARE CurrentGameID INT;
    DECLARE userID INT;

    SET @LastGameID = 0; 

    -- define the customer ID to be handled now

    SET @userID = 0;

    -- select the next game to handle    
    SELECT @CurrentGameID = id
    FROM online_games
    WHERE id > LastGameID
    ORDER BY id LIMIT 0,1;

    -- as long as we have customers......    
    WHILE (@CurrentGameID IS NOT NULL) 
    DO
        -- call your sproc

        -- set the last customer handled to the one we just handled
        SET @LastGameID = @CurrentGameID;
        SET @CurrentGameID = NULL;

        -- select the random bot
        SELECT @userID = userID
        FROM users
        WHERE FIND_IN_SET('bot',baseInfo)
        ORDER BY RAND() LIMIT 0,1;

        -- update the game
        UPDATE online_games SET userID = @userID WHERE id = @CurrentGameID;

        -- select the next game to handle    
        SELECT @CurrentGameID = id
         FROM online_games
         WHERE id > LastGameID
         ORDER BY id LIMIT 0,1;
    END WHILE;
    SET output = "done";
END;//

CALL setFakeUsers(@status);
SELECT @status;

1

এর আরও ভাল সমাধান হ'ল

  1. সঞ্চিত প্রক্রিয়াটির অনুলিপি / অতীত কোড
  2. আপনি যে টেবিলটি আবার এটি চালাতে চান তার সাথে সেই কোডটিতে যোগ দিন (প্রতিটি সারির জন্য)

এটি আপনি একটি পরিষ্কার টেবিল-ফর্ম্যাট আউটপুট পান। আপনি যদি প্রতিটি সারির জন্য এসপি চালান, আপনি প্রতিটি পুনরাবৃত্তির জন্য একটি পৃথক ক্যোয়ারী ফলাফল পাবেন যা কুৎসিত।


0

যদি আদেশটি গুরুত্বপূর্ণ হয়

--declare counter
DECLARE     @CurrentRowNum BIGINT = 0;
--Iterate over all rows in [DataTable]
WHILE (1 = 1)
    BEGIN
        --Get next row by number of row
        SELECT TOP 1 @CurrentRowNum = extendedData.RowNum
                    --here also you can store another values
                    --for following usage
                    --@MyVariable = extendedData.Value
        FROM    (
                    SELECT 
                        data.*
                        ,ROW_NUMBER() OVER(ORDER BY (SELECT 0)) RowNum
                    FROM [DataTable] data
                ) extendedData
        WHERE extendedData.RowNum > @CurrentRowNum
        ORDER BY extendedData.RowNum

        --Exit loop if no more rows
        IF @@ROWCOUNT = 0 BREAK;

        --call your sproc
        --EXEC dbo.YOURSPROC @MyVariable
    END

0

আমার কাছে এমন কিছু প্রোডাকশন কোড ছিল যা একবারে কেবলমাত্র 20 জন কর্মচারী পরিচালনা করতে পারে, নীচের কোডটির কাঠামোটি। আমি সবেমাত্র প্রোডাকশন কোডটি অনুলিপি করেছি এবং নীচে জিনিসগুলি সরিয়েছি।

ALTER procedure GetEmployees
    @ClientId varchar(50)
as
begin
    declare @EEList table (employeeId varchar(50));
    declare @EE20 table (employeeId varchar(50));

    insert into @EEList select employeeId from Employee where (ClientId = @ClientId);

    -- Do 20 at a time
    while (select count(*) from @EEList) > 0
    BEGIN
      insert into @EE20 select top 20 employeeId from @EEList;

      -- Call sp here

      delete @EEList where employeeId in (select employeeId from @EE20)
      delete @EE20;
    END;

  RETURN
end

-1

আমি এর অনুরূপ কিছু করতে চাই (যদিও এটি এখনও কার্সার ব্যবহারের সাথে খুব মিল)

[কোড]

-- Table variable to hold list of things that need looping
DECLARE @holdStuff TABLE ( 
    id INT IDENTITY(1,1) , 
    isIterated BIT DEFAULT 0 , 
    someInt INT ,
    someBool BIT ,
    otherStuff VARCHAR(200)
)

-- Populate your @holdStuff with... stuff
INSERT INTO @holdStuff ( 
    someInt ,
    someBool ,
    otherStuff
)
SELECT  
    1 , -- someInt - int
    1 , -- someBool - bit
    'I like turtles'  -- otherStuff - varchar(200)
UNION ALL
SELECT  
    42 , -- someInt - int
    0 , -- someBool - bit
    'something profound'  -- otherStuff - varchar(200)

-- Loop tracking variables
DECLARE @tableCount INT
SET     @tableCount = (SELECT COUNT(1) FROM [@holdStuff])

DECLARE @loopCount INT
SET     @loopCount = 1

-- While loop variables
DECLARE @id INT
DECLARE @someInt INT
DECLARE @someBool BIT
DECLARE @otherStuff VARCHAR(200)

-- Loop through item in @holdStuff
WHILE (@loopCount <= @tableCount)
    BEGIN

        -- Increment the loopCount variable
        SET @loopCount = @loopCount + 1

        -- Grab the top unprocessed record
        SELECT  TOP 1 
            @id = id ,
            @someInt = someInt ,
            @someBool = someBool ,
            @otherStuff = otherStuff
        FROM    @holdStuff
        WHERE   isIterated = 0

        -- Update the grabbed record to be iterated
        UPDATE  @holdAccounts
        SET     isIterated = 1
        WHERE   id = @id

        -- Execute your stored procedure
        EXEC someRandomSp @someInt, @someBool, @otherStuff

    END

[/ কোড]

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

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