SQL Server 스크립트 : Alter Procedure- 각 Alter를 선택하지 않고도 하나의 스크립트로 여러 개의 Alter 프로 시저를 실행합니다.

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

문제

나는 이것이 큰 문제가 아니라는 것을 알고 있지만, 어쨌든 나를 간지럽 힙니다.

  1. 새 데이터 테이블, 제약 조건, 열을 추가하기위한 일부 테이블 변경, 테이블 변경 사항을 고려하여 절차 변경 등 SQL Server 2005 스크립트가 있습니다.
  2. 스크립트가 내 Alter Procedure 문을 만나기 전까지는 모든 것이 잘 실행됩니다.
  3. 오류 메시지는 다음과 같습니다.

"MSG 156, 레벨 15, 상태 1, 프로 시저 CPROMO_GET_CONSULTDETAILS_PROMOTIONBAN, 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

오류는 두 번 클릭했을 때 첫 번째 '엔드'키워드가 발생합니다. 내가 전혀 얻지 못하는 것은 하나의 Alter 진술을 선택할 때, 그것은 잘 실행되고 매끄럽습니다! 선택없이 [F5]를 눌러 모두 실행하려고 할 때, 그것은 나에게 오류를줍니다.

나는 Alter 문을 또 다른 시작에 포함 시키려고 노력했지만, 운이 좋지는 않지만 키워드 변경 근처에 구문 오류가 있다고 말합니다 ...

편집하다: 시작 명세서 이후에 수행 된 수정에 주석하기 때문일 수 있습니까?

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"명령문 삽입
  2. 공백 영역 (ARVO)에 보이지 않는 문자가 없는지 확인하십시오.
  3. 시작 ... 종료 진술은 불필요한 것으로 밝혀졌다 (Mayo)
  4. AS 내에서의 반 콜론 제거 ... 절차에 따라 코어가 약간의 문제를 일으키는 것처럼 보였습니다 (Mayo)
  5. 내 질문 편집에 설명 된 프로 시저 코어 내의 의견은 중요하지 않으며 위의 점을 확인한 후에는 오류가 발생하지 않았습니다 (직접).

이것이 언젠가 누군가에게 도움이되기를 바랍니다.

모두 덕분에 크레딧은 여러분 모두에게 간다!

다른 팁

Alter Stepemnts 사이에 "GO"를 삽입하십시오

첫 번째 변경 절차가 시작된 후에 가십시오 ... 끝

을 추가하다 go 모든 후에 진술 end 절차 진술. 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)가있을 수 있습니다. 끝과 후속 변경 사이의 모든 것을 제거한 다음 (Newlines 포함 - 엔탈레이터를 포함하여) 라인을 다시 나누고 글을 쓸 수 있습니다.

Net에서 샘플 코드를 복사 한 후 개인적으로 보았습니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top