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

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

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

  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
    

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

有帮助吗?

解决方案 2

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

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

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

其他提示

插入“go”在alter statemnts之间

在第一个ALTER PROCEDURE BEGIN ... END

之后放一个GO

在每个 end 过程语句后添加 go 语句。 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。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top