SQL Server-Skript: ALTE VERFAHREN - Ausführen mehrere ALTEN PROCEDURE in ein Skript, ohne jede der ALTEN nacheinander auswählen müssen
-
07-07-2019 - |
Frage
Ich weiß, dass dies kein großes Problem, aber es kitzelt mich trotzdem.
- Ich habe einen Server 2005-Skript SQL neue Datentabellen, Einschränkungen zu erstellen, einige Tabellen zu ändern Spalten hinzufügen, Verfahren zur Änderung der Tabellenänderungen zu berücksichtigen, etc.
- läuft alles gut, bis die Skript PROCEDURE-Anweisungen meiner ALTE trifft.
- Die Fehlermeldung lautet wie folgt:
"Msg 156, Ebene 15, Status 1, Prozedur cpromo_Get_ConsultDetails_PromotionBan, Zeile 59 Falsche Syntax in der Nähe der Stichwort 'Verfahren'.
Hier ist ein Beispiel für meinen Skript:
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
Die Fehlerpunkte in Richtung des ersten ‚Ende‘ Schlüsselwort auf, wenn doppelgeklickt. Was ich überhaupt nicht bekommen ist, wenn man ALTER-Anweisung nach der anderen der Auswahl, es läuft ganz gut und glatt! Wenn ich versuche, sie alle durch Drücken der Taste [F5], ohne die Auswahl zu laufen, es gibt mir den Fehler.
Ich habe versucht, die ALTER-Anweisungen zum Einbetten in eine anderen BEGIN ... END, aber kein Glück, sagt es, dass es ein Syntaxfehler nahe dem Schlüsselwort ALTEN ...
EDIT:? Kann es sein, weil ich die Änderungen durchgeführt, nachdem der Beginn Aussage Kommentar
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
Dankt für jede Hilfe oder ein Stichwort.
Lösung 2
Diese Antwort ist nicht von mir, wie es das Ergebnis all den Antworten, die ich bekommen habe. Jede Antwort hat einen Teil der Lösung, also wollte ich eine Antwort mit allen Punkten die Lösung setzen.
- Legen Sie ein "GO" statement zwischen jedem einzelnen ALTER PROCEDURE-Anweisung (Jeder, der beantwortet)
- Stellen Sie sicher, dass keine unsichtbaren Zeichen in den weißen Raum Bereich gibt es (Arvo)
- Die BEGIN ... END-Anweisungen ergeben, als unnötig (Mayo)
- Die Semikolons Entfernung innerhalb des AS ... GO per Prozedur Kern schien einige Probleme entweder (Mayo) zu verursachen
- Die Kommentare im Rahmen des Verfahrens Kern wie in meiner Frage des bearbeiten beschrieben keine Rolle spielt, ist es nicht die Ursache für einen Fehler, wenn die oben genannten Punkte wurden geprüft (Myself)
Hope dies dazu beitragen wird jemand einen Tag.
Vielen Dank an alle, gehen Kredite an alle!
Andere Tipps
Einfügen "go" zwischen alten Aussagen
Setzen Sie ein GO nach dem ersten ALTER PROCEDURE BEGIN ... END
Fügen Sie eine go
Anweisung nach jeder end
Prozeduranweisung. go
„Signalisiert das Ende einer Charge von Transact-SQL-Anweisungen für den SQL Server-Dienstprogramme.“ ( http://msdn.microsoft.com/en-us/library/ms188037 aspx ).
ich mit den Go Aussagen zustimmen - aber vielleicht sind die Klammern um Ihre Parameter verursachen die Syntaxfehler? Hier ist, was mein Team nutzt ...
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
Sie können einige unsichtbare Zeichen (nbspace zum Beispiel) haben in weißen Raumbereich zwischen dem ersten und dem zweiten Verfahren. Entfernen Sie alles zwischen Ende und anschließenden alten (einschließlich Zeilenumbrüche - was endALTER), legen dann einige Zeilenumbrüche zurück und schreibt auf einigen Zeilen GO
.Ich habe das persönlich gesehen, nachdem einige Beispiel-Code von Netto-Kopieren:)