Script de SQL Server: ALTER PROCEDURE - Ejecutando múltiples ALTER PROCEDURE en un script sin tener que seleccionar cada uno de ALTER uno tras otro

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

Pregunta

Sé que esto no es un gran problema, pero de todos modos me hace cosquillas.

  1. Tengo un script de SQL Server 2005 para crear nuevas tablas de datos, restricciones, alterar algunas tablas para agregar columnas, modificar los procedimientos para tener en cuenta los cambios de la tabla, etc.
  2. Todo funciona bien hasta que el script encuentre mis declaraciones ALTER PROCEDURE.
  3. El mensaje de error es el siguiente:
  

" Mensaje 156, Nivel 15, Estado 1, Procedimiento   cpromo_Get_ConsultDetails_PromotionBan,   Línea 59 Sintaxis incorrecta cerca del   palabra clave 'PROCEDIMIENTO'.

Aquí hay una muestra de mi 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

El error apunta hacia la primera palabra clave 'final' encontrada cuando se hace doble clic. Lo que no obtengo es que cuando selecciono una declaración ALTER después de otra, ¡funciona bien y sin problemas! Cuando trato de ejecutarlos todos presionando [F5] sin seleccionar, me da el error.

Traté de incrustar las declaraciones ALTER en otro BEGIN ... END, pero no tuve suerte, dice que hay un error de sintaxis cerca de la palabra clave ALTER ...

  

EDITAR: ¿Puede ser porque comento las modificaciones realizadas después de la declaración de inicio?

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

Gracias por cualquier ayuda o alguna señal.

¿Fue útil?

Solución 2

Esta respuesta no es mía, ya que es el resultado de todas las respuestas que he recibido. Cada respuesta tiene una parte de la solución, por lo que quería poner una respuesta con todos los puntos de la solución.

  1. Inserte un " GO " declaración entre cada una de las declaraciones ALTER PROCEDURE (Todos los que respondieron)
  2. Asegúrese de que no haya caracteres invisibles en el área de espacio en blanco (Arvo)
  3. Las declaraciones BEGIN ... END reveladas como innecesarias (Mayo)
  4. La eliminación de punto y coma dentro del AS ... GO según el núcleo del procedimiento parecía causar problemas (Mayo)
  5. Los comentarios dentro del núcleo del procedimiento como se describe en la edición de mi pregunta no importan, no causó ningún error una vez que se verificaron los puntos anteriores (Yo mismo)

Espero que esto ayude a alguien algún día.

¡Gracias a todos, los créditos van para todos ustedes!

Otros consejos

inserte " vaya " entre alter statemnts

Ponga un GO después de que su ALTER PROCEDIMIENTO COMIENCE ... FIN

Agregue una instrucción go después de cada instrucción de procedimiento end . go " Señala el final de un lote de instrucciones Transact-SQL a las utilidades de SQL Server. " ( http://msdn.microsoft.com/en-us/library/ms188037 .aspx ).

Estoy de acuerdo con las declaraciones go, pero ¿quizás los paréntesis alrededor de sus parámetros están causando los errores de sintaxis? Esto es lo que usa mi equipo ...

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

Es posible que tenga algunos caracteres invisibles (nbspace por ejemplo) en el área de espacio en blanco entre el primer y el segundo procedimiento. Elimine todo entre el final y la modificación posterior (incluidas las nuevas líneas, lo que da como resultado endALTER), luego vuelva a colocar algunos saltos de línea y escriba GO en alguna línea.

Lo he visto personalmente, después de copiar un código de muestra de la red :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top