2009-09-16 84 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

相關問題