2

これは大きな問題ではないことは知っていますが、とにかく私をくすぐります。

  1. 新しいデータテーブル、制約、列を追加するためのいくつかのテーブルの変更、テーブルの変更を考慮に入れるためのプロシージャの変更などを行うSQLServer2005スクリプトがあります。
  2. スクリプトがALTERPROCEDUREステートメントに遭遇するまで、すべてが正常に実行されます。
  3. エラーメッセージは次のとおりです。

"メッセージ156、レベル15、状態1、プロシージャ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

助けや手がかりをありがとう。

4

6 に答える 6

6

この答えは私が得たすべての答えの結果であるため、私のものではありません。それぞれの答えには解決策の一部があるので、私は解決策のすべてのポイントを含む答えを出したいと思いました。

  1. すべてのALTERPROCEDUREステートメントの間に「GO」ステートメントを挿入します(回答したすべての人)
  2. 空白領域に非表示の文字がないことを確認してください(Arvo)
  3. BEGIN ... ENDステートメントが不要であることが明らかになりました(Mayo)
  4. 手順コアによるAS...GO内のセミコロンの削除も、問題を引き起こすようでした(Mayo)
  5. 私の質問の編集で説明されているプロシージャコア内のコメントは重要ではありません。上記の点を確認すると、エラーは発生しませんでした(自分自身)

これがいつか誰かを助けることを願っています。

皆さんのおかげで、クレジットは皆さんに贈られます!

于 2009-09-16T15:21:22.823 に答える
5

alterstatemntsの間に「go」を挿入します

于 2009-09-16T12:53:44.147 に答える
2

最初のALTERPROCEDUREBEGIN...ENDの後にGOを配置します

于 2009-09-16T12:54:20.177 に答える
2

goすべてのendプロシージャステートメントの後にステートメントを追加します。go「Transact-SQLステートメントのバッチの終わりをSQLServerユーティリティに通知します。」(http://msdn.microsoft.com/en-us/library/ms188037.aspx)。

于 2009-09-16T12:55:41.080 に答える
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
于 2009-09-16T13:14:54.660 に答える
2

最初の手順と2番目の手順の間の空白領域に、非表示の文字(nbspaceなど)が含まれている場合があります。endと後続のalterの間のすべてを削除し(改行を含む-endALTERになります)、いくつかの改行を戻し、いくつかの行にGOを書き込みます。

ネットからサンプルコードをコピーした後、私はそれを個人的に見ました:)

于 2009-09-16T13:30:48.687 に答える