Sql server 2005 SQL Server脚本:ALTER PROCEDURE-在一个脚本中执行多个ALTER过程,而不必逐个选择每个ALTER
我知道这不是一个大问题,但不管怎么说,它让我觉得好笑Sql server 2005 SQL Server脚本:ALTER PROCEDURE-在一个脚本中执行多个ALTER过程,而不必逐个选择每个ALTER,sql-server-2005,alter-table,alter,sql-scripts,Sql Server 2005,Alter Table,Alter,Sql Scripts,我知道这不是一个大问题,但不管怎么说,它让我觉得好笑 我有一个SQLServer2005脚本来创建新的数据表、约束、更改一些表以添加列、更改过程以考虑表的更改,等等 在脚本遇到我的ALTER PROCEDURE语句之前,一切都正常运行 错误消息如下所示: “Msg 156,第15级,状态1,程序 cpromo\u获得\u咨询详细信息\u促销禁令, 第59行靠近 关键字“过程” 以下是我的脚本示例: ALTER PROCEDURE [dbo].[cpromo_Get_ConsultDetails_
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
错误指向双击时遇到的第一个“end”关键字。我根本没有得到的是,当选择一个又一个ALTER语句时,它运行得非常顺利!当我尝试在没有选择的情况下按[F5]来运行它们时,它会给我错误
我试图将ALTER语句嵌入到另一个BEGIN…END中,但没有成功,它说关键字ALTER附近有语法错误
编辑:是否因为我对begin语句之后执行的修改进行了注释
感谢您提供的任何帮助或提示。在alter语句之间插入“go”在第一个alter过程开始后开始…结束在每个
结束
过程语句之后添加一个go
语句。go
“向SQL Server实用程序发出一批Transact-SQL语句结束的信号。”().我同意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)。请删除end和后续alter之间的所有字符(包括换行符-导致endALTER),然后将一些换行符放回,并在某一行上写入GO
我个人看到,在从网上复制了一些示例代码后:)这个答案不是我的,因为它是我得到的所有答案的结果。每个答案都有解决方案的一部分,所以我想给出一个包含解决方案所有要点的答案
感谢大家,大家的功劳都归你们了!按照建议,我在每个ALTER过程开始…结束后插入了“go”,然后它显示了“ALTER”附近的另一个语法错误。我确实尝试删除了这里另一个程序员建议的所有参数括号(很遗憾,他没有时间记住他的名字),但仍然有错误消息Msg 156,级别15,状态1,过程cpromo\u Get\u ConsultDetails\u PromotionBan,第59行关键字“ALTER”附近语法不正确。它将我指向第一个“end”“当我双击它的时候,我会考虑说,我做的是复制和粘贴生成的ALTE过程脚本吗?我很抱歉。这个项目是在一个客户端站点上进行的,我没有得到内部编程团队的太多支持。我成功地解决了语法错误。我要感谢你们所有人的回答,我将为你们提供正确的解决方案。这都是你的答案。它现在给了我错误:Msg 156,级别15,状态1,过程cpromo\u Get\u ConsultDetails\u PromotionBan,第59行关键字“ALTER”附近的语法不正确。感谢Matts Wrock的回答。我试着像在我的问题中评论的那样使用它,但是在关键字ALTER附近出现了一个语法错误,尽管当作为单个ALTER语句运行时(选中时),所有这些语句都运行得很好,很平滑。即使在插入了“GO”关键字之后。这样就不会有任何begin…end语句了?我还是要试试。谢谢这里是我在删除begin…end语句时收到的错误消息:发生了致命的脚本错误。解析GO时遇到了错误的语法。我通常不会看到的另一件事是您的一些语句末尾的分号。也许是这些阻止了AS和GO之间的代码被解释为单个块?我确实删除了分号,但错误仍然存在。我将尝试删除Arvo建议的任何不可见字符。我们永远不知道!谢谢你花时间和考虑回答我的问题。谢谢你的及时回答。你注意到我的编辑了吗?周围有什么东西吗?你没有开始。。。在那些语句中结束?我最终习惯于在ALTER PROCEDURE语句中不包含任何BEGIN…END语句。谢谢!这绝对是我没有想到的!:-)天知道这会发生!呵呵。。。我试试看!这解决了我的一部分问题,因为报告的错误数量显著减少,这一点都不显著!;-)谢谢
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