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
-
07-07-2019 - |
Question
Je sais que ce n'est pas un gros problème, mais ça me titille quand même.
- 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.
- Tout va bien jusqu'à ce que le script rencontre mes instructions ALTER PROCEDURE.
- 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.
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.
- Insérer un " GO " déclaration entre chaque déclaration ALTER PROCEDURE (toutes les personnes ayant répondu)
- Assurez-vous qu'il n'y a pas de caractères invisibles dans l'espace blanc (Arvo)
- Les déclarations BEGIN ... END se sont révélées inutiles (Mayo)
- La suppression des points-virgules dans l'AS ... GO, selon la procédure de base, a semblé poser problème (Mayo)
- 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: