SQL Server脚本:ALTER PROCEDURE - 在一个脚本中执行多个ALTER PROCEDURE,而不必逐个选择每个ALTER

时间:2009-09-16 12:49:24

标签: sql-server-2005 alter-table alter sql-scripts

我知道这不是一个大问题,但无论如何它都让我感到痒痒。

  1. 我有一个SQL Server 2005脚本来创建新的数据表,约束,改变一些表来添加列,改变程序以考虑表的更改等等。
  2. 一切正常,直到脚本遇到我的ALTER PROCEDURE语句。
  3. 错误消息如下:
  4.   

    “Msg 156,Level 15,State 1,Procedure   cpromo_Get_ConsultDetails_PromotionBan,   第59行附近的语法不正确   关键字'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
    

    错误指向双击时遇到的第一个'end'关键字。我根本没有得到的是当一个接一个地选择一个ALTER语句时,它运行得非常顺畅!当我尝试在没有选择的情况下按[F5]来运行它们时,它会给我错误。

    我试图将ALTER语句嵌入另一个BEGIN ... END,但没有运气,它说关键字ALTER附近有语法错误......

      

    编辑:可以,因为我评论了在begin语句后执行的修改吗?

    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
    

    感谢任何帮助或任何暗示。

6 个答案:

答案 0 :(得分:4)

在alter statements

之间插入“go”

答案 1 :(得分:3)

这个答案不是我的,因为它是我得到的所有答案的结果。每个答案都有解决方案的一部分,所以我想对解决方案提出所有要点的答案。

  1. 在每个ALTER PROCEDURE语句(每个回答的人)之间插入“GO”语句
  2. 确保空白区域(Arvo)中没有不可见的字符
  3. BEGIN ... END声明显示是不必要的(Mayo)
  4. AS内的分号移除......根据程序核心GO似乎也造成了一些麻烦(Mayo)
  5. 我的问题编辑中描述的程序核心内的注释无关紧要,一旦检查了以上几点就没有引起任何错误(我自己)
  6. 希望有一天这会有所帮助。

    感谢所有人,所有人都可以获得积分!

答案 2 :(得分:2)

在第一个ALTER PROCEDURE BEGIN ... END

之后放一个GO

答案 3 :(得分:2)

在每个go过程语句后添加end语句。 go“将一批Transact-SQL语句的结尾发送给SQL Server实用程序。” (http://msdn.microsoft.com/en-us/library/ms188037.aspx)。

答案 4 :(得分: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

答案 5 :(得分:2)

在第一个和第二个过程之间的空白区域中可能有一些不可见的字符(例如nbspace)。删除end和后续alter之间的所有内容(包括换行符 - 导致endALTER),然后放回一些换行符并在某些行上写GO。

我从网上复制了一些示例代码之后亲自看到了这一点:)