Script di SQL Server: ALTER PROCEDURE - Esecuzione di più ALTER PROCEDURE in uno script senza dover selezionare ciascuno degli ALTER uno dopo l'altro
-
07-07-2019 - |
Domanda
So che questo non è un grosso problema, ma mi solletica comunque.
- 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.
- Tutto funziona bene fino a quando lo script non incontra le mie istruzioni ALTER PROCEDURE.
- 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.
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.
- Inserisci un " GO " dichiarazione tra ciascuna istruzione ALTER PROCEDURE (Tutti coloro che hanno risposto)
- Assicurati che non ci siano caratteri invisibili nell'area degli spazi bianchi (Arvo)
- Le dichiarazioni BEGIN ... END si sono rivelate inutili (Mayo)
- La rimozione dei punti e virgola all'interno dell'AS ... GO secondo il nucleo della procedura sembrava causare qualche problema (Mayo)
- 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 :)