Сценарий SQL Server: ALTER PROCEDURE - выполнение нескольких ALTER PROCEDURE в одном скрипте без необходимости выбирать каждый из ALTER один за другим

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

Вопрос

Я знаю, что это не большая проблема, но она все равно меня щекочет.

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

    " Сообщение 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 PROCEDURE (все, кто ответил)
  • Убедитесь, что в области пустого пространства (Arvo) нет невидимых символов
  • Заявления BEGIN ... END оказались ненужными (Мейо)
  • Удаление точек с запятой в AS ... GO в соответствии с процедурным ядром, похоже, также вызывало некоторые проблемы (Майо)
  • Комментарии в ядре процедуры, описанные в редактировании моего вопроса, не имеют значения, они не вызвали никаких ошибок после проверки вышеуказанных пунктов (сам)
  • Надеюсь, это когда-нибудь кому-нибудь поможет.

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

    Другие советы

    вставить " 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:)

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top