البرنامج النصي لخادم SQL:ALTER PROCEDURE - تنفيذ إجراءات ALTER متعددة في برنامج نصي واحد دون الحاجة إلى تحديد كل ALTER واحدًا تلو الآخر
-
07-07-2019 - |
سؤال
أعلم أن هذه ليست مشكلة كبيرة، لكنها تدغدغني على أي حال.
- لدي برنامج نصي SQL Server 2005 لإنشاء جداول بيانات جديدة، وقيود، وتغيير بعض الجداول لإضافة أعمدة، وتغيير الإجراءات لأخذ تغييرات الجدول في الاعتبار، وما إلى ذلك.
- كل شيء يسير على ما يرام حتى يواجه البرنامج النصي عبارات ALTER PROCEDURE الخاصة بي.
- رسالة الخطأ هي كما يلي:
"رسالة 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
هذه الإجابة ليست إجابتي لأنها نتيجة كل الإجابات التي حصلت عليها.كل إجابة لها جزء من الحل، لذلك أردت أن أضع إجابة بكل نقاط الحل.
- أدخل عبارة "GO" بين كل عبارة ALTER PROCEDURE (كل من أجاب)
- تأكد من عدم وجود أحرف غير مرئية في منطقة المساحة البيضاء (Arvo)
- تبين أن عبارات BEGIN...END غير ضرورية (Mayo)
- يبدو أن إزالة الفواصل المنقوطة داخل AS...GO وفقًا للإجراء الأساسي تسبب بعض المشاكل أيضًا (Mayo)
- التعليقات الموجودة داخل الإجراء الأساسي كما هو موضح في تعديل سؤالي لا تهم، فهي لم تسبب أي خطأ بمجرد التحقق من النقاط المذكورة أعلاه (نفسي)
نأمل أن يساعد هذا شخص ما يوما ما.
شكرا للجميع، الاعتمادات تذهب لكم جميعا!
نصائح أخرى
أدخل "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 :)