Сценарий SQL Server: ALTER PROCEDURE - выполнение нескольких ALTER PROCEDURE в одном скрипте без необходимости выбирать каждый из ALTER один за другим
-
07-07-2019 - |
Вопрос
Я знаю, что это не большая проблема, но она все равно меня щекочет.
<Ол>" Сообщение 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
Ошибка указывает на первое ключевое слово «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 statemnts
Поместите GO после того, как ваш первый ALTER PROCEDURE BEGIN ... END
Добавьте оператор go
после каждого оператора процедуры end
. go
" Сигнализирует об окончании пакета инструкций Transact-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) в области пробелов между первой и второй процедурой. Удалите все между end и последующим alter (включая переводы строк - в результате endALTER), затем верните несколько разрывов строк назад и напишите GO на какой-то строке.
Я видел это лично, скопировав пример кода из net:)