2009-09-16 9 views
2

Я знаю, что это не большая проблема, но это все равно меня щекочет.SQL Server script: ALTER PROCEDURE - Выполнение нескольких ALTER PROCEDURE в один скрипт без необходимости выбирать каждый из ALTER один за другим

  1. у меня есть сервер 2005 сценарий SQL для создания новых таблиц данных, ограничения, изменяющий некоторые таблицы для добавления столбцов, изменения процедуры принять изменения таблицы во внимание и т.д.
  2. Все работает отлично до встречи сценария мои инструкции ALTER PROCEDURE.
  3. Сообщение об ошибке выглядит следующим образом:

"Msg 156, Level 15, State 1, Procedure cpromo_Get_ConsultDetails_PromotionBan, Line 59 Incorrect syntax near the keyword 'PROCEDURE'.

Вот пример моего сценария:

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 

Точки ошибок в направлении первой «конец» ключевое слово встречается при двойном щелчке. То, что я вообще не получаю, - это когда вы выбираете одно утверждение ALTER за другим, оно работает просто отлично и плавно! Когда я пытаюсь запустить их все, нажав [F5] без выбора, это дает мне ошибку.

Я пытался вставлять операторы ALTER в другой BEGIN ... END, но не повезло, он не говорит, что есть ошибка синтаксиса около ключевого слова ALTER ...

EDIT: Can it be because I comment the modifications performed after the begin statement?

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 

Спасибо за любые помощь или любую реплику.

+0

Следуя рекомендациям, я вставил «GO» после каждого запуска ALTER PROCEDURE ... end, затем он обнаруживает другую синтаксическую ошибку рядом с «ALTER». –

+0

Я попытался удалить все скобки параметров, как это предложил другой программист (кто жалеет, что у меня не было времени запомнить его имя), но все же есть сообщение об ошибке Msg 156, уровень 15, состояние 1, процедура cpromo_Get_ConsultDetails_PromotionBan, Строка 59 Неправильный синтаксис рядом с ключевым словом «ALTER». Это указывает мне на первое ключевое слово «конец», когда я дважды нажимаю на него. –

+0

Должен ли я считать, что то, что я сделал, скопировано и вставило сгенерированный скрипт ALTER PROCEDURE для каждой из процедур, один под другим? –

ответ

3

Этого ответ не мой, так как это результат всех ответов я получил. Каждый ответ имеет часть решения, поэтому я хотел бы ответить на все вопросы в решении.

  1. Вставьте «GO» заявление между каждым и каждым оператором процедуры ALTER (Все, кто ответил)
  2. Убедитесь, что нет невидимых символов в белой области пространства (Арво)
  3. Бегина ... Заявления END, которые считаются ненужными (Mayo)
  4. Удаление полуколонок в пределах AS ...GO в соответствии с процедурным ядром, казалось, вызывало некоторые проблемы (Mayo)
  5. Замечания в ядре процедуры, как описано в редактировании моего вопроса, не имеют значения, это не вызывало ошибок, как только указанные выше пункты были отмечены (Myself)

Надеюсь, это когда-нибудь поможет кому-нибудь.

Спасибо всем, кредиты идут всем вам!

4

вставка "идти" между альтер statemnts

+0

Поблагодарите Matts Wrock за ваш ответ. Я попробовал это, как прокомментировал мой вопрос, но затем я получил синтаксическую ошибку рядом с ключевым словом ALTER, хотя при запуске как одного оператора ALTER (если выбрано) все они выполняются просто отлично и плавно. Даже после того, как вы вставили ключевое слово «GO». –

2

Помещенный GO после вашей первой процедуры ALTER BEGIN ... END

+0

Спасибо за ваш быстрый ответ. Вы заметили мое редактирование? Может быть, это что-то вокруг? –

+0

У вас нет BEGIN ... END в этих статутах? – bleeeah

+0

Я, наконец, использовал, чтобы не включать какие-либо инструкции BEGIN ... END в сами инструкции ALTER PROCEDURE. –

2

go Добавить заявление после каждого end оператора процедуры. go «Сигналы завершают пакет операторов Transact-SQL утилитам SQL Server». (http://msdn.microsoft.com/en-us/library/ms188037.aspx).

+0

Теперь он дает мне ошибку: Msg 156, уровень 15, состояние 1, процедура cpromo_Get_ConsultDetails_PromotionBan, строка 59 Неверный синтаксис рядом с ключевым словом «ALTER». –

2

Я согласен с операциями 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 
+0

Таким образом, не было бы никаких начинающих ... конечных утверждений? –

+0

Я все равно попробую. Благодаря! –

+0

Вот сообщение об ошибке, которое я получаю при удалении операторов begin ... end. Произошла фатальная ошибка сценария. Неправильный синтаксис встречался при разборе GO. –

2

Вы можете иметь некоторые невидимые символы (nbspace, например) в белой области пространства между первой и второй процедурой. Удалите все между окончанием и последующим изменением (включая новые строки - в результате получится endALTER), затем отложите несколько строк и запустите GO на какой-либо строке.

Я видел, что лично, после копирования некоторых примеров кода из сети :)

+0

Спасибо! Это определенно то, о чем я не думал! :-) И Бог знает, что это происходит! Хе-хе ... Я попробую! –

+0

Это решило часть моей проблемы, так как количество зарегистрированных ошибок резко сократилось, что совсем не драматично! ;-) Благодаря! –