SQL Server-Skript: ALTE VERFAHREN - Ausführen mehrere ALTEN PROCEDURE in ein Skript, ohne jede der ALTEN nacheinander auswählen müssen

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

Frage

Ich weiß, dass dies kein großes Problem, aber es kitzelt mich trotzdem.

  1. 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.
  2. läuft alles gut, bis die Skript PROCEDURE-Anweisungen meiner ALTE trifft.
  3. 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.

War es hilfreich?

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.

  1. Legen Sie ein "GO" statement zwischen jedem einzelnen ALTER PROCEDURE-Anweisung (Jeder, der beantwortet)
  2. Stellen Sie sicher, dass keine unsichtbaren Zeichen in den weißen Raum Bereich gibt es (Arvo)
  3. Die BEGIN ... END-Anweisungen ergeben, als unnötig (Mayo)
  4. Die Semikolons Entfernung innerhalb des AS ... GO per Prozedur Kern schien einige Probleme entweder (Mayo)
  5. zu verursachen
  6. 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:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top