SQL Server 스크립트 : Alter Procedure- 각 Alter를 선택하지 않고도 하나의 스크립트로 여러 개의 Alter 프로 시저를 실행합니다.
-
07-07-2019 - |
문제
나는 이것이 큰 문제가 아니라는 것을 알고 있지만, 어쨌든 나를 간지럽 힙니다.
- 새 데이터 테이블, 제약 조건, 열을 추가하기위한 일부 테이블 변경, 테이블 변경 사항을 고려하여 절차 변경 등 SQL Server 2005 스크립트가 있습니다.
- 스크립트가 내 Alter Procedure 문을 만나기 전까지는 모든 것이 잘 실행됩니다.
- 오류 메시지는 다음과 같습니다.
"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
이 대답은 내가 얻은 모든 대답의 결과이기 때문에 내 것이 아닙니다. 각 답변에는 솔루션의 일부가 있으므로 솔루션에 대한 모든 포인트에 대한 답변을 원했습니다.
- 각각의 모든 변경 절차 문 (답변을 한 모든 사람) 사이에 "GO"명령문 삽입
- 공백 영역 (ARVO)에 보이지 않는 문자가 없는지 확인하십시오.
- 시작 ... 종료 진술은 불필요한 것으로 밝혀졌다 (Mayo)
- AS 내에서의 반 콜론 제거 ... 절차에 따라 코어가 약간의 문제를 일으키는 것처럼 보였습니다 (Mayo)
- 내 질문 편집에 설명 된 프로 시저 코어 내의 의견은 중요하지 않으며 위의 점을 확인한 후에는 오류가 발생하지 않았습니다 (직접).
이것이 언젠가 누군가에게 도움이되기를 바랍니다.
모두 덕분에 크레딧은 여러분 모두에게 간다!
다른 팁
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에서 샘플 코드를 복사 한 후 개인적으로 보았습니다 :)