script do SQL Server: ALTER PROCEDIMENTO - Execução de múltiplos ALTER PROCEDURE em um script sem ter que selecionar cada um dos ALTER um após o outro
-
07-07-2019 - |
Pergunta
Eu sei que este não é um grande problema, mas me agrada de qualquer maneira.
- Eu tenho um script SQL Server 2005 para criar novas tabelas de dados, restrições, alterando algumas tabelas para adicionar colunas, alterando os procedimentos a tomar as alterações da tabela em conta, etc.
- Tudo corre bem até que o script encontra minhas declarações ALTER PROCEDURE.
- A mensagem de erro é o seguinte:
"Msg 156, Nível 15, estado 1, procedimento cpromo_Get_ConsultDetails_PromotionBan, Linha 59 Sintaxe incorrecta perto a palavra-chave 'PROCEDURE'.
Aqui está uma amostra do meu script:
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
Os pontos de erro para a primeira 'final' palavra-chave encontradas quando clicado duas vezes. O que eu não entendo nada é ao selecionar uma instrução ALTER após o outro, ele funciona muito bem e suave! Quando tento executar todos eles pressionando [F5] com nenhuma seleção, dá-me o erro.
Eu tentei incorporar as declarações ALTER em outro BEGIN ... END, mas sem sorte, ele diz que há um erro de sintaxe próximo a palavra-chave ALTER ...
EDIT:? Pode ser porque eu comentar as modificações realizadas após a declaração começar
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
Obrigado de qualquer ajuda ou qualquer sugestão.
Solução 2
Esta resposta não é meu, pois é o resultado de todas as respostas que tenham obtido. Cada resposta tem uma parte da solução, então eu queria colocar uma resposta com todos os pontos para a solução.
- Inserir uma declaração "GO" entre cada instrução ALTER PROCEDIMENTO (Todos os que responderam)
- Certifique-se que há personagens invisíveis na área de espaço em branco (Arvo)
- O BEGIN ... END declarações revelou-se desnecessário (Mayo)
- A remoção ponto e vírgula dentro do AS ... GO conforme procedimento núcleo parecia causar alguns problemas ou (Mayo)
- Os comentários dentro do núcleo procedimento descrito na edição de minha pergunta não importa, não causar qualquer erro uma vez que os pontos acima foram verificados (eu)
Espero que isso vai ajudar alguém um dia.
Obrigado a todos, os créditos vão para todos vocês!
Outras dicas
insert "go" entre as declarações alter
Coloque um GO após a sua primeira ALTER PROCEDIMENTO BEGIN ... END
Adicionar um comunicado go
após cada declaração procedimento end
. go
"assinala o fim de um lote de instruções Transact-SQL para os utilitários do SQL Server." ( http://msdn.microsoft.com/en-us/library/ms188037 aspx ).
Eu concordo com as declarações GO - mas talvez os parênteses em torno de seus parâmetros estão causando os erros de sintaxe? Aqui está o que os meus usos da equipe ...
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
Você pode ter alguns caracteres invisíveis (nbspace por exemplo) na área de espaço em branco entre o primeiro eo segundo procedimento. Remover tudo entre o final e subsequente alter (incluindo novas linhas - resultando em endALTER), em seguida, colocar alguma linha breaks trás e gravação GO em alguma linha
.Eu vi que, pessoalmente, depois de copiar um código de exemplo a partir net:)