Script di SQL Server: ALTER PROCEDURE - Esecuzione di più ALTER PROCEDURE in uno script senza dover selezionare ciascuno degli ALTER uno dopo l'altro

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

Domanda

So che questo non è un grosso problema, ma mi solletica comunque.

  1. Ho uno script di SQL Server 2005 per creare nuove tabelle di dati, vincoli, alterare alcune tabelle per aggiungere colonne, alterare le procedure per tenere conto delle modifiche alla tabella, ecc.
  2. Tutto funziona bene fino a quando lo script non incontra le mie istruzioni ALTER PROCEDURE.
  3. Il messaggio di errore è il seguente:
  

" Messaggio 156, Livello 15, Stato 1, Procedura   cpromo_Get_ConsultDetails_PromotionBan,   Riga 59 Sintassi errata vicino a   parola chiave "PROCEDURA".

Ecco un esempio del mio 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'errore punta verso la prima parola chiave "end" riscontrata quando si fa doppio clic. Quello che non capisco affatto quando si seleziona un'istruzione ALTER dopo l'altra, funziona perfettamente e senza intoppi! Quando provo a eseguirli tutti premendo [F5] senza selezione, mi dà l'errore.

Ho provato a incorporare le istruzioni ALTER in un altro BEGIN ... END, ma senza fortuna, dice che c'è un errore di sintassi vicino alla parola chiave ALTER ...

  

EDIT: può essere perché commento le modifiche apportate dopo la dichiarazione di inizio?

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

Grazie per qualsiasi aiuto o suggerimento.

È stato utile?

Soluzione 2

Questa risposta non è mia in quanto è il risultato di tutte le risposte che ho ottenuto. Ogni risposta ha una parte della soluzione, quindi ho voluto mettere una risposta con tutti i punti alla soluzione.

  1. Inserisci un " GO " dichiarazione tra ciascuna istruzione ALTER PROCEDURE (Tutti coloro che hanno risposto)
  2. Assicurati che non ci siano caratteri invisibili nell'area degli spazi bianchi (Arvo)
  3. Le dichiarazioni BEGIN ... END si sono rivelate inutili (Mayo)
  4. La rimozione dei punti e virgola all'interno dell'AS ... GO secondo il nucleo della procedura sembrava causare qualche problema (Mayo)
  5. I commenti all'interno del nucleo della procedura come descritti nella modifica della mia domanda non contano, non ha causato alcun errore una volta verificati i punti precedenti (Io stesso)

Spero che questo possa aiutare qualcuno un giorno.

Grazie a tutti, i crediti vanno a tutti voi!

Altri suggerimenti

inserisci " vai " tra alter statemnts

Metti un GO dopo la tua prima PROCEDURA ALTER INIZIA ... FINE

Aggiungi un'istruzione go dopo ogni istruzione di procedura end . go " Segnala la fine di un batch di istruzioni Transact-SQL alle utility di SQL Server. " ( http://msdn.microsoft.com/en-us/library/ms188037 aspx ).

Sono d'accordo con le dichiarazioni go - ma forse le parentesi attorno ai tuoi parametri stanno causando gli errori di sintassi? Ecco cosa usa il mio team ...

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

Potresti avere alcuni caratteri invisibili (ad esempio nbspace) nell'area degli spazi bianchi tra la prima e la seconda procedura. Rimuovi tutto tra end e successiva modifica (comprese le nuove righe - risultante in endALTER), quindi metti alcune interruzioni di riga e scrivi GO su qualche riga.

L'ho visto personalmente, dopo aver copiato del codice di esempio da net :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top