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
-
07-07-2019 - |
Pregunta
Sé que esto no es un gran problema, pero de todos modos me hace cosquillas.
- 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.
- Todo funciona bien hasta que el script encuentre mis declaraciones ALTER PROCEDURE.
- 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.
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.
- Inserte un " GO " declaración entre cada una de las declaraciones ALTER PROCEDURE (Todos los que respondieron)
- Asegúrese de que no haya caracteres invisibles en el área de espacio en blanco (Arvo)
- Las declaraciones BEGIN ... END reveladas como innecesarias (Mayo)
- La eliminación de punto y coma dentro del AS ... GO según el núcleo del procedimiento parecía causar problemas (Mayo)
- 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 :)