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

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

Pergunta

Eu sei que este não é um grande problema, mas me agrada de qualquer maneira.

  1. 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.
  2. Tudo corre bem até que o script encontra minhas declarações ALTER PROCEDURE.
  3. 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.

Foi útil?

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.

  1. Inserir uma declaração "GO" entre cada instrução ALTER PROCEDIMENTO (Todos os que responderam)
  2. Certifique-se que há personagens invisíveis na área de espaço em branco (Arvo)
  3. O BEGIN ... END declarações revelou-se desnecessário (Mayo)
  4. A remoção ponto e vírgula dentro do AS ... GO conforme procedimento núcleo parecia causar alguns problemas ou (Mayo)
  5. 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:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top