Script SQL Server: ALTER PROCEDURE - Exécution de plusieurs procédures ALTER PROCEDURE dans un script sans avoir à sélectionner chacune des options ALTER l'une après l'autre

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

Question

Je sais que ce n'est pas un gros problème, mais ça me titille quand même.

  1. J'ai un script SQL Server 2005 pour créer de nouvelles tables de données, des contraintes, modifier certaines tables pour ajouter des colonnes, modifier des procédures pour prendre en compte les modifications de table, etc.
  2. Tout va bien jusqu'à ce que le script rencontre mes instructions ALTER PROCEDURE.
  3. Le message d'erreur est le suivant:
  

& msg 156, niveau 15, état 1, procédure   cpromo_Get_ConsultDetails_PromotionBan,   Ligne 59 Syntaxe incorrecte près du   mot clé 'PROCEDURE'.

Voici un exemple de mon script:

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

L'erreur pointe vers le premier mot clé "fin" rencontré lors d'un double-clic. Ce que je ne comprends pas du tout, c'est lorsque je sélectionne une déclaration ALTER après l'autre, elle fonctionne parfaitement! Lorsque j'essaie de tous les exécuter en appuyant sur [F5] sans aucune sélection, cela me donne l'erreur.

J'ai essayé d'incorporer les instructions ALTER dans un autre document BEGIN ... END, mais pas de chance, il est indiqué qu'il existe une erreur de syntaxe à proximité du mot clé ALTER ...

  

MODIFIER: Cela peut-il être dû au fait que je commente les modifications apportées après l'instruction begin?

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

Merci de votre aide ou de votre aide.

Était-ce utile?

La solution 2

Cette réponse n’est pas la mienne, c’est le résultat de toutes les réponses que j’ai obtenues. Chaque réponse ayant une partie de la solution, je voulais donc mettre une réponse avec tous les points de la solution.

  1. Insérer un " GO " déclaration entre chaque déclaration ALTER PROCEDURE (toutes les personnes ayant répondu)
  2. Assurez-vous qu'il n'y a pas de caractères invisibles dans l'espace blanc (Arvo)
  3. Les déclarations BEGIN ... END se sont révélées inutiles (Mayo)
  4. La suppression des points-virgules dans l'AS ... GO, selon la procédure de base, a semblé poser problème (Mayo)
  5. Les commentaires dans le noyau de la procédure tels que décrits dans la question de ma question importent peu, cela n'a causé aucune erreur une fois que les points ci-dessus ont été vérifiés (moi-même)

J'espère que cela aidera quelqu'un un jour.

Merci à tous, les crédits vous reviennent!

Autres conseils

insérez "go" entre alter statemnts

Mettez un GO après votre première ALTER PROCEDURE BEGIN ... END

Ajoutez une instruction go après chaque instruction de procédure end . go "Indique la fin d'un lot d'instructions Transact-SQL aux utilitaires SQL Server." ( http://msdn.microsoft.com/en-us/library/ms188037 .aspx ).

Je suis d'accord avec les instructions go - mais peut-être que les parenthèses autour de vos paramètres sont à l'origine des erreurs de syntaxe? Voici ce que mon équipe utilise ...

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

Il se peut que certains caractères invisibles (nbspace, par exemple) se trouvent dans une zone vide entre la première et la deuxième procédure. Supprimez tout ce qui se situe entre la fin et la modification ultérieure (y compris les retours à la ligne, ce qui donne finALTER), puis réinstallez certains sauts de ligne et écrivez GO sur une ligne.

J'ai vu cela personnellement, après avoir copié un exemple de code de net:

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top