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

Sql server 2005 SQL Server脚本:ALTER PROCEDURE-在一个脚本中执行多个ALTER过程,而不必逐个选择每个ALTER,sql-server-2005,alter-table,alter,sql-scripts,Sql Server 2005,Alter Table,Alter,Sql Scripts,我知道这不是一个大问题,但不管怎么说,它让我觉得好笑 我有一个SQLServer2005脚本来创建新的数据表、约束、更改一些表以添加列、更改过程以考虑表的更改,等等 在脚本遇到我的ALTER PROCEDURE语句之前,一切都正常运行 错误消息如下所示: “Msg 156,第15级,状态1,程序 cpromo\u获得\u咨询详细信息\u促销禁令, 第59行靠近 关键字“过程” 以下是我的脚本示例: ALTER PROCEDURE [dbo].[cpromo_Get_ConsultDetails_

我知道这不是一个大问题,但不管怎么说,它让我觉得好笑

  • 我有一个SQLServer2005脚本来创建新的数据表、约束、更改一些表以添加列、更改过程以考虑表的更改,等等
  • 在脚本遇到我的ALTER PROCEDURE语句之前,一切都正常运行
  • 错误消息如下所示:
  • “Msg 156,第15级,状态1,程序 cpromo\u获得\u咨询详细信息\u促销禁令, 第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附近有语法错误

    编辑:是否因为我对begin语句之后执行的修改进行了注释


    感谢您提供的任何帮助或提示。

    在alter语句之间插入“go”

    在第一个alter过程开始后开始…结束

    在每个
    结束
    过程语句之后添加一个
    go
    语句。
    go
    “向SQL Server实用程序发出一批Transact-SQL语句结束的信号。”().

    我同意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


    我个人看到,在从网上复制了一些示例代码后:)

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

  • 在每个ALTER PROCEDURE语句和每个ALTER PROCEDURE语句之间插入“GO”语句(回答的每个人)
  • 确保空白区域(Arvo)中没有不可见字符
  • 开始…结束声明被认为是不必要的(梅奥)
  • AS…GO AS per procedure core中分号的移除似乎也造成了一些麻烦(梅奥)
  • 在我的问题编辑中所描述的过程核心中的注释无关紧要,一旦检查了以上几点(我自己),它不会导致任何错误
  • 希望有一天这能帮助别人



    感谢大家,大家的功劳都归你们了!

    按照建议,我在每个ALTER过程开始…结束后插入了“go”,然后它显示了“ALTER”附近的另一个语法错误。我确实尝试删除了这里另一个程序员建议的所有参数括号(很遗憾,他没有时间记住他的名字),但仍然有错误消息Msg 156,级别15,状态1,过程cpromo\u Get\u ConsultDetails\u PromotionBan,第59行关键字“ALTER”附近语法不正确。它将我指向第一个“end”“当我双击它的时候,我会考虑说,我做的是复制和粘贴生成的ALTE过程脚本吗?我很抱歉。这个项目是在一个客户端站点上进行的,我没有得到内部编程团队的太多支持。我成功地解决了语法错误。我要感谢你们所有人的回答,我将为你们提供正确的解决方案。这都是你的答案。它现在给了我错误:Msg 156,级别15,状态1,过程cpromo\u Get\u ConsultDetails\u PromotionBan,第59行关键字“ALTER”附近的语法不正确。感谢Matts Wrock的回答。我试着像在我的问题中评论的那样使用它,但是在关键字ALTER附近出现了一个语法错误,尽管当作为单个ALTER语句运行时(选中时),所有这些语句都运行得很好,很平滑。即使在插入了“GO”关键字之后。这样就不会有任何begin…end语句了?我还是要试试。谢谢这里是我在删除begin…end语句时收到的错误消息:发生了致命的脚本错误。解析GO时遇到了错误的语法。我通常不会看到的另一件事是您的一些语句末尾的分号。也许是这些阻止了AS和GO之间的代码被解释为单个块?我确实删除了分号,但错误仍然存在。我将尝试删除Arvo建议的任何不可见字符。我们永远不知道!谢谢你花时间和考虑回答我的问题。谢谢你的及时回答。你注意到我的编辑了吗?周围有什么东西吗?你没有开始。。。在那些语句中结束?我最终习惯于在ALTER PROCEDURE语句中不包含任何BEGIN…END语句。谢谢!这绝对是我没有想到的!:-)天知道这会发生!呵呵。。。我试试看!这解决了我的一部分问题,因为报告的错误数量显著减少,这一点都不显著!;-)谢谢
    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