البرنامج النصي لخادم SQL:ALTER PROCEDURE - تنفيذ إجراءات ALTER متعددة في برنامج نصي واحد دون الحاجة إلى تحديد كل ALTER واحدًا تلو الآخر

StackOverflow https://stackoverflow.com/questions/1432757

سؤال

أعلم أن هذه ليست مشكلة كبيرة، لكنها تدغدغني على أي حال.

  1. لدي برنامج نصي SQL Server 2005 لإنشاء جداول بيانات جديدة، وقيود، وتغيير بعض الجداول لإضافة أعمدة، وتغيير الإجراءات لأخذ تغييرات الجدول في الاعتبار، وما إلى ذلك.
  2. كل شيء يسير على ما يرام حتى يواجه البرنامج النصي عبارات ALTER PROCEDURE الخاصة بي.
  3. رسالة الخطأ هي كما يلي:

"رسالة 156 ، المستوى 15 ، حالة 1 ، الإجراء cpromo_Get_ConsultDetails_PromotionBan ، سطر 59 بناء جملة غير صحيح بالقرب من الكلمة الرئيسية "إجراء".

إليك عينة من البرنامج النصي الخاص بي:

ALTER PROCEDURE [dbo].[cpromo_Get_ConsultDetails_PromotionBan] 
(
 @idPromoBan int, 
 @uid int 
)
AS
begin
 set nocount on;

 /* 1-  detail de la promo */
 SELECT p.[nopromo], p.[StartDate], p.[EndDate], p.[DateText]
 FROM [cpromo_PromotionBanniere] as pb
 INNER JOIN [cpromo_Promotions] as p ON p.[idPromo] = pb.[idPromo]
 WHERE (pb.[idPromoBan] = @idPromoBan)

 /* 2 - cartes de la promo */
 SELECT pis.[idCardText], ct.[nom], ct.[descr], ct.[prix], ct.[prixCoupon], ct.[qtyItem], i.[Impact]
 FROM [cpromo_PromotionsItems] as pis
 INNER JOIN [cpromo_Impacts] as i ON i.[idImpact] = pis.[idImpact] 
 INNER JOIN [cpromo_CardText] as ct ON ct.[idCardText] = pis.[idCardText]
 WHERE (pis.[idPromoBan] = @idPromoBan)
 ORDER BY i.[iorder], ct.[nom];

 /* 3 - pvedettes opti */
 SELECT m.[idCardText], m.[qtyCardL], m.[qtyCardM], m.[qtyCardMG], m.[qtyCardS],
     ISNULL(m.[qtyCardMini], 0) as qtyCardMini,
     ISNULL(m.[qtyCardMiniPTJ], 0) as qtyCardMiniPTJ
 FROM [cpromo_MEMCards] as m
 INNER JOIN [cpromo_CardText] as ct ON ct.[idCardText] = m.[idCardText]
 WHERE (m.[idPromoBan] = @idPromoBan)
 ORDER BY ct.[nom];


 /* 4 - cart */
 SELECT [idCartEl], [idCardText], [qtyL], [qtyM], [qtyMG], [qtyS],
     ISNULL([qtyMini], 0) as qtyMini,
     ISNULL([qtyMiniPTJ], 0) as qtyMiniPTJ
 FROM [cpromo_UserCarts]
 WHERE ([uid] = @uid AND [idPromoBan] = @idPromoBan);
end


ALTER PROCEDURE [dbo].[cpromo_Get_CartItems_ByPromotionBan] 
(
 @uid int,
 @idPromoBan int 
)
AS
begin
 set nocount on;

 SELECT ct.nom, ct.descr, p.DateText, ct.prix, ct.prixCoupon, ct.qtyItem,
           uc.qtyL, uc.qtyM, uc.qtyMG, uc.qtyS,
     isnull(uc.qtyMini, 0) as qtyMini,
     isnull(uc.qtyMiniPTJ, 0) as qtyMiniPTJ, 3 as qteLimite
 FROM cpromo_UserCarts as uc
 INNER JOIN cpromo_CardText as ct ON ct.idCardText = uc.idCardText 
 INNER JOIN cpromo_PromotionBanniere as pb ON pb.idPromoBan = uc.idPromoBan 
 INNER JOIN cpromo_Promotions  as p ON p.idPromo = pb.idPromo
 WHERE (uc.uid = @uid) AND (uc.idPromoBan = @idPromoBan);
end

يشير الخطأ إلى الكلمة الأساسية "النهاية" الأولى التي تمت مواجهتها عند النقر عليها نقرًا مزدوجًا.ما لا أفهمه على الإطلاق هو أنه عند اختيار عبارة ALTER واحدة تلو الأخرى، فإنها تعمل بشكل جيد وسلس!عندما أحاول تشغيلها جميعًا بالضغط على [F5] بدون تحديد، يعطيني الخطأ.

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

يحرر: هل يمكن أن يكون ذلك لأنني أعلق على التعديلات التي تم إجراؤها بعد بيان البداية؟

ALTER PROCEDURE [dbo].[cpromo_Get_ConsultDetails_PromotionBan] 
    (
     @idPromoBan int, 
     @uid int 
    )
    AS
    begin
------------------
-- Added column to take table changes into account blah blah blah...
------------------
     set nocount on;

     /* 1-  detail de la promo */
     SELECT p.[nopromo], p.[StartDate], p.[EndDate], p.[DateText]
     FROM [cpromo_PromotionBanniere] as pb
     INNER JOIN [cpromo_Promotions] as p ON p.[idPromo] = pb.[idPromo]
     WHERE (pb.[idPromoBan] = @idPromoBan)

     /* 2 - cartes de la promo */
     SELECT pis.[idCardText], ct.[nom], ct.[descr], ct.[prix], ct.[prixCoupon], ct.[qtyItem], i.[Impact]
     FROM [cpromo_PromotionsItems] as pis
     INNER JOIN [cpromo_Impacts] as i ON i.[idImpact] = pis.[idImpact] 
     INNER JOIN [cpromo_CardText] as ct ON ct.[idCardText] = pis.[idCardText]
     WHERE (pis.[idPromoBan] = @idPromoBan)
     ORDER BY i.[iorder], ct.[nom];

     /* 3 - pvedettes opti */
     SELECT m.[idCardText], m.[qtyCardL], m.[qtyCardM], m.[qtyCardMG], m.[qtyCardS],
         ISNULL(m.[qtyCardMini], 0) as qtyCardMini,
         ISNULL(m.[qtyCardMiniPTJ], 0) as qtyCardMiniPTJ
     FROM [cpromo_MEMCards] as m
     INNER JOIN [cpromo_CardText] as ct ON ct.[idCardText] = m.[idCardText]
     WHERE (m.[idPromoBan] = @idPromoBan)
     ORDER BY ct.[nom];


     /* 4 - cart */
     SELECT [idCartEl], [idCardText], [qtyL], [qtyM], [qtyMG], [qtyS],
         ISNULL([qtyMini], 0) as qtyMini,
         ISNULL([qtyMiniPTJ], 0) as qtyMiniPTJ
     FROM [cpromo_UserCarts]
     WHERE ([uid] = @uid AND [idPromoBan] = @idPromoBan);
    end

شكرا على أي مساعدة أو أي جديلة.

هل كانت مفيدة؟

المحلول 2

هذه الإجابة ليست إجابتي لأنها نتيجة كل الإجابات التي حصلت عليها.كل إجابة لها جزء من الحل، لذلك أردت أن أضع إجابة بكل نقاط الحل.

  1. أدخل عبارة "GO" بين كل عبارة ALTER PROCEDURE (كل من أجاب)
  2. تأكد من عدم وجود أحرف غير مرئية في منطقة المساحة البيضاء (Arvo)
  3. تبين أن عبارات BEGIN...END غير ضرورية (Mayo)
  4. يبدو أن إزالة الفواصل المنقوطة داخل AS...GO وفقًا للإجراء الأساسي تسبب بعض المشاكل أيضًا (Mayo)
  5. التعليقات الموجودة داخل الإجراء الأساسي كما هو موضح في تعديل سؤالي لا تهم، فهي لم تسبب أي خطأ بمجرد التحقق من النقاط المذكورة أعلاه (نفسي)

نأمل أن يساعد هذا شخص ما يوما ما.

شكرا للجميع، الاعتمادات تذهب لكم جميعا!

نصائح أخرى

أدخل "go" بين عبارات التغيير

ضع GO بعد بدء إجراء التغيير الأول ...نهاية

أضف go بيان بعد كل end بيان الإجراء. go "يشير إلى نهاية مجموعة من عبارات SQL للعمليات إلى الأدوات المساعدة SQL Server." (http://msdn.microsoft.com/en-us/library/ms188037.aspx).

أتفق مع عبارات go - ولكن ربما تكون الأقواس المحيطة بالمعلمات هي السبب في حدوث أخطاء في بناء الجملة؟إليك ما يستخدمه فريقي...

SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS OFF 
GO

ALTER PROCEDURE dbo.proc
@param1 int
AS
   select 1
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

-- repeat for additional procedures

قد يكون لديك بعض الأحرف غير المرئية (nbspace على سبيل المثال) في المساحة البيضاء بين الإجراء الأول والثاني.قم بإزالة كل شيء بين النهاية والتغيير اللاحق (بما في ذلك الأسطر الجديدة - مما يؤدي إلى endALTER)، ثم أعد بعض فواصل الأسطر واكتب GO في بعض الأسطر.

لقد رأيت ذلك شخصيًا، بعد نسخ بعض نماذج التعليمات البرمجية من net :)

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