2009-09-16 47 views
2

我知道这不是一个大问题,但它无论如何都让我感到痒痒。SQL Server脚本:ALTER PROCEDURE - 将多个ALTER PROCEDURE执行到一个脚本中,而不必一个接一个地选择每个ALTER

  1. 我有一个SQL Server 2005的脚本来创建新的数据表,约束,改变一些表添加列,更改程序,借此表变化考虑进去,等
  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

遵循这些建议,我在每个单独的ALTER PROCEDURE begin ... end之后插入“GO”,然后在“ALTER”附近显示另一个语法错误。 – 2009-09-16 12:57:31

+0

我尝试删除所有的参数括号,这是另一位程序员在这里建议的(我后悔没有时间记住他的名字),但仍然有错误信息消息156,级别15,状态1,过程cpromo_Get_ConsultDetails_PromotionBan,第59行关键字'ALTER'附近的语法错误。当我双击它时,它指向第一个“结束”关键字。 – 2009-09-16 13:14:22

+0

我是否应该说我所做的是将生成的ALTER PROCEDURE脚本复制并粘贴到另一个下面的每个过程中? – 2009-09-16 13:16:34

回答

3

这个答案是不是我的,因为它是我已经得到了所有的答案的结果。每个答案都有解决方案的一部分,所以我想用解决方案的所有要点来回答问题。

  1. 插入每个ALTER PROCEDURE语句之间的“GO”的声明(大家谁回答)
  2. 确保没有在空白区域(帕特)没有不可见的字符
  3. 的BEGIN ... END语句显示是不必要的(Mayo)
  4. AS中的分号删除...根据程序核心去看起来似乎也造成了一些麻烦(Mayo)
  5. 在我的问题的编辑中描述的程序核心中的注释并不重要,一旦检查了上面的点,它并没有导致任何错误(Myself)

希望这将有助于某人某一天。

感谢大家,积分归功于大家!

4

插入 “走出去” ALTER statemnts

+0

感谢Matts Wrock提供的答案。我在我的问题中试了一下,但后来在关键字ALTER附近出现了一个语法错误,虽然当作为单个ALTER语句(选中时)运行时,它们都运行得很好而且流畅。即使插入了“GO”关键字。 – 2009-09-16 13:06:39

2

之间把你的第一个ALTER PROCEDURE后,GO BEGIN ... END

+0

感谢您的及时答复。你有没有注意到我的编辑?它可以是它周围的东西吗? – 2009-09-16 13:29:30

+0

你在这些陈述中没有BEGIN ... END? – bleeeah 2009-09-16 14:34:42

+0

我终于在ALTER PROCEDURE语句本身中不使用任何BEGIN ... END语句。 – 2009-09-17 01:23:06

2

添加go声明每end PROCEDURE语句之后。 “go”将一批Transact-SQL语句的末尾标记为SQL Server实用程序。“ (http://msdn.microsoft.com/en-us/library/ms188037.aspx)。

+0

它现在给我错误:消息156,级别15,状态1,过程cpromo_Get_ConsultDetails_PromotionBan,行59 关键字'ALTER'附近的语法不正确。 – 2009-09-16 13:01:26

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

因此,不会有任何开始......结束语句? – 2009-09-16 13:17:38

+0

无论如何,我都会尝试。谢谢! – 2009-09-16 13:18:25

+0

这里删除begin ... end语句时得到的错误消息:发生致命脚本错误。 解析GO时遇到语法错误。 – 2009-09-16 13:20:50

2

您可能必须在第一和第二道工序之间的空白区的一些不可见的字符(nbspace为例)。删除end和后续alter(包括换行符 - 导致endALTER)之间的所有内容,然后放回一些换行符并在某行写入GO。

我已经看到了个人,从净:)复制一些示例代码后

+0

谢谢!这绝对是我没有想到的事情! :-)上帝知道它发生了!呵呵呵...我会尽力的! – 2009-09-16 13:32:41

+0

这解决了我的问题的一部分,因为报告的错误数量急剧下降,这根本不是戏剧性的! ;-) 谢谢! – 2009-09-16 13:55:42

相关问题