سؤال

وأنا جديدة جدا لSQL أستطيع العمل مع البيانات الأساسية بسهولة إلى حد ما ولكن أنا لم أحسب الحلقات حتى الان.

Foreach(JobHeaderID AS @OldJobHeaderID in dbo.EstimateJobHeader WHERE EstimateID=@OldEstimateID)  
{  
  INSERT EstimateJobHeader (ServiceID,EstimateID) 
  SELECT ServiceID, @NewEstimateID 
  FROM EstimateJobHeader 
  WHERE EstimateID=@OldEstimateID;  

  SELECT @err = @@error 
  IF @err <> 0 
  BEGIN 
    ROLLBACK TRANSACTION 
    SET @RETURN_VALUE = 4 
    RETURN 4 
  END  

  SET @NewJobHeaderID = CAST(SCOPE_IDENTITY() AS INT)  

  SELECT @err = @@error 
  IF @err <> 0 
  BEGIN 
    ROLLBACK TRANSACTION 
    SET @RETURN_VALUE = 3 
    RETURN 3 
  END  

  INSERT EstimateDetail (JobHeaderID, OtherCols) 
  SELECT (@NewJobHeaderID,OtherCols) 
  FROM EstimateDetail 
  WHERE JobHeaderID=@OldJobHeaderID

  SELECT @err = @@error 
  IF @err <> 0 
  BEGIN 
    ROLLBACK TRANSACTION 
    SET @RETURN_VALUE = 3 
    RETURN 3 
  END  

  INSERT EstimateJobDetail (JobHeaderID, OtherCols) 
  SELECT (@NewJobHeaderID, OtherCols) 
  FROM EstimateJobDetail 
  WHERE JobHeaderID=@OldJobHeaderID  

  SELECT @err = @@error 
  IF @err <> 0 
  BEGIN 
    ROLLBACK TRANSACTION 
    SET @RETURN_VALUE = 3 
    RETURN 3 
  END  
}
هل كانت مفيدة؟

المحلول

ويجب تجنب التكرار في الإجراءات المخزنة.

وSQL هي لغة التعريفي، بدلا من لغات حتمية كنت الأكثر استخداما ل. يجب إما أن يتم كل شيء تقريبا ما تريد القيام به مع حلقة كما عمل على أساس تحديد أو القيام به في التعليمات البرمجية العميل. هناك، بالطبع، استثناءات، ولكن ليست كثيرة كما تظن.

وانظر هذا:
لماذا يكون من الصعب جدا القيام حلقة في T-SQL


وأنت سألت عن كيفية القيام بذلك باستخدام الأساليب القائمة على مجموعات. أنا سوف أبذل قصارى جهدي، ولكن هناك خلل في التعليمات البرمجية في وقت مبكر أن يجعل من الصعب التأكد من أنا أقرأ ذلك الحق. الشرط على بيان INSERT الأول يطابق حالة على حلقة foreach. ذلك إما حلقة سيتم تشغيل سوى مرة واحدة (عاد سجل واحد هناك)، أو إدراج الخاص بك هو تقحم عدة أرقام قياسية جديدة في التكرار (نعم، يمكن ادخال البيانات إضافة أكثر من سجل واحد في وقت واحد). واذا كان مضيفا العديد من السجلات، لماذا فقط الحصول على هوية التي أنشأتها إدراج الماضي؟

وقال ذلك، وأعتقد أنني أفهم جيدا بما فيه الكفاية لتظهر لك شيئا. يبدو أنك كنت مجرد تقديم نسخة من تقدير. أنت أيضا لا تفسر حيث تأتي قيمةNewEstimateID من. إذا كان هناك الجدول الأصل فليكن، ولكن سيكون من المفيد أن نعرف عنه.

/* Where'd @NewEstimateID come from? */
/* If there are several records in EstimateJobHeader with @OldEstimateID,
 *  this will insert one new record for each of them */
INSERT EstimateJobHeader (ServiceID,EstimateID)
     SELECT ServiceID, @NewEstimateID 
     FROM EstimateJobHeader
     WHERE EstimateID= @OldEstimateID

/* Copy EstimateDetail records from old estimate to new estimate */
INSERT EstimateDetail (JobHeaderID, OtherCols) 
    SELECT (new.JobHeaderID,ed.OtherCols) 
    FROM EstimateJobHeader new
    INNER JOIN EstimateJobHeader old ON old.EstimateID= @OldEstimateID 
        AND new.EstimateID= @NewEstimateID AND old.ServiceID=new.ServiceID
    INNER JOIN EstimateDetail ed ON ed.JobHeaderID= old.JobHeaderID

/* Copy EstimateJobDetail records from old estimate to new estimate */
INSERT EstimateJobDetail (JobHeaderID, OtherCols)
    SELECT (new.JobHeaderID,ed.OtherCols) 
    FROM EstimateJobHeader new
    INNER JOIN EstimateJobHeader old ON old.EstimateID= @OldEstimateID 
        AND new.EstimateID= @NewEstimateID AND old.ServiceID=new.ServiceID
    INNER JOIN EstimateJobDetail ejd ON ejd.JobHeaderID= old.JobHeaderID

ورمز أعلاه يجعل افتراض ServiceID + EstimateID هي فريدة من نوعها داخل الجدول EstimateJobHeader. إذا لم تكن هذه هي الحالة، أريد أن أعرف ما العمود أو الأعمدة لا تعرف بشكل فريد الصفوف في الجدول، حتى أستطيع أن تنضم إلى السجل القديم مع الجديد وتكون على يقين من العلاقة هي 1: 1.

وأخيرا، التدقيق تم حذف الخطأ الإيجاز.

نصائح أخرى

ونلقي نظرة على البيان WHILE:

http://msdn.microsoft.com/en -US / مكتبة / aa260676 (SQL.80) .aspx اتصال

ومع ذلك، اعتمادا على ما تحاول القيام به، هناك ربما، طريقة أفضل أساس وضع لتفعل ما يحاولون القيام به، وينبغي أن تنظر في ذلك أولا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top