Bei der Erstellung einer stored-procedure für den MS-SQL-Server 2005 stoße ich auf das Problem, das bei der Verwendung eines GO-Befehls immer wieder eine Fehlermeldung kommt (als "normales" SQL-Skript funktioniert alles perfekt). Eigentlich sollten GO-Befehle doch funzen, oder? Kann mir dabei jemand helfen?
Announcement
Collapse
No announcement yet.
GO-Befehl in stored procedure
Collapse
X
-
Originally posted by Thomas Rith View PostHallo Hamschk,
ich weiss zwar nicht, wie die Procedure aussieht, aber wenn Du GO einfach weglässt, sollte es auch funktionieren... GO dient eigentlich nur als Batch-Seperator in den Scripten...
Gruß
Thomas
ich hab's ohne GO auch schon probiert. Da das Skript aber verhältnismässig lang ist und mit temporären Dateien arbeitet bricht er mir immer wieder ab,
da er bestimmte Spalten nicht findet.
Grüße
Markus
Comment
-
Ein kleiner Ausschnitt aus dem Skript:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author: <none>
-- Create date: <none>
-- Description: <XXX>
-- =============================================
ALTER PROCEDURE [dbo].[sp_Test]
/*(
@DatumVon varchar(8),
@DatumBis varchar(8)
)*/
AS
BEGIN
SET IMPLICIT_TRANSACTIONS ON
/*Berechnung des Umsatzes 2006*/
IF EXISTS (SELECT * FROM SYS.OBJECTS
WHERE OBJECT_ID = OBJECT_ID(N'tmp1')
AND TYPE IN (N'U'))
DROP TABLE tmp1
/*Eigentliche Berechnung des Umsatzes 2006 in tmp-file*/
ALTER TABLE Berechnung.T_KUNDE
ADD KUN_Umsatz2006 FLOAT
SELECT Berechnung.T_KUNDE.KUN_ID, SUM(Berechnung.T_Position.POS_Umsatz) AS Umsatz
INTO tmp1
FROM Berechnung.T_KUNDE INNER JOIN
Berechnung.T_Position ON Berechnung.T_KUNDE.KUN_Id_Ref = Berechnung.T_Position.POS_Kunde_ID
WHERE POS_Datum >= 20060101 AND POS_Datum <= 20061231
GROUP BY Berechnung.T_KUNDE.KUN_ID
/*Update des Umsatzes in Berechnung.T_Kunde*/
UPDATE Berechnung.T_KUNDE
SET Berechnung.T_KUNDE.KUN_Umsatz2006=tmp1.Umsatz
FROM Berechnung.T_KUNDE FULL OUTER JOIN
tmp1 ON Berechnung.T_KUNDE.KUN_ID = tmp1.KUN_ID
UPDATE Berechnung.T_KUNDE
SET KUN_Umsatz2006 = 0
WHERE KUN_Umsatz2006 IS NULL
IF EXISTS (SELECT * FROM SYS.OBJECTS
WHERE OBJECT_ID = OBJECT_ID(N'tmp1')
AND TYPE IN (N'U'))
DROP TABLE tmp1
COMMIT TRANSACTION
/*Berechnung des Gesamtumsatzes*/
IF EXISTS (SELECT * FROM SYS.OBJECTS
WHERE OBJECT_ID = OBJECT_ID(N'tmp1')
AND TYPE IN (N'U'))
DROP TABLE tmp1
/*Eigentliche Berechnung des Umsatzes in tmp-file*/
ALTER TABLE Berechnung.T_KUNDE
ADD KUN_Umsatz_gesamt FLOAT
SELECT Berechnung.T_KUNDE.KUN_ID, SUM(Berechnung.T_Position.POS_Umsatz) AS Umsatz
INTO tmp1
FROM Berechnung.T_KUNDE INNER JOIN
Berechnung.T_Position ON Berechnung.T_KUNDE.KUN_Id_Ref = Berechnung.T_Position.POS_Kunde_ID
GROUP BY Berechnung.T_KUNDE.KUN_ID
/*Update des Umsates in Berechnung.T_Kunde*/
UPDATE Berechnung.T_KUNDE
SET Berechnung.T_KUNDE.KUN_Umsatz_gesamt=tmp1.Umsatz
FROM Berechnung.T_KUNDE FULL OUTER JOIN
tmp1 ON Berechnung.T_KUNDE.KUN_ID = tmp1.KUN_ID
UPDATE Berechnung.T_KUNDE
SET KUN_Umsatz_gesamt = 0
WHERE KUN_Umsatz_gesamt IS NULL
IF EXISTS (SELECT * FROM SYS.OBJECTS
WHERE OBJECT_ID = OBJECT_ID(N'tmp1')
AND TYPE IN (N'U'))
DROP TABLE tmp1
COMMIT TRANSACTION
SET IMPLICIT_TRANSACTIONS OFF
END
Comment
-
Angepasst
Hi hamschk76,
hab den Code mal ein bissle angepasst... Sollte jetzt einfacher sein. Und die Tabellenänderungen würde ich vorher in einem extrascript machen... vielleicht ist das auch das Problem...
Gruß
Thomas
Code:ALTER PROCEDURE [dbo].[sp_Test] /*( @DatumVon varchar(8), @DatumBis varchar(8) )*/ AS BEGIN SET IMPLICIT_TRANSACTIONS ON /*Berechnung des Umsatzes 2006*/ /* -- Wird nicht benötigt!! IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'tmp1') AND TYPE IN (N'U')) DROP TABLE tmp1 */ /*Eigentliche Berechnung des Umsatzes 2006 in tmp-file*/ -- Vorher anlegen... aber wenn schon dann prüfen, da man die Procedure sonst nur einmal ausführen kann... if (select COLUMNPROPERTY(OBJECT_ID('Berechnung.T_KUNDE'), 'KUN_Umsatz2006' , 'AllowsNull')) is null ALTER TABLE Berechnung.T_KUNDE ADD KUN_Umsatz2006 FLOAT /*Update des Umsatzes in Berechnung.T_Kunde*/ UPDATE Berechnung.T_KUNDE SET Berechnung.T_KUNDE.KUN_Umsatz2006 = isnull(tmp.Umsatz, 0) FROM Berechnung.T_KUNDE Left Join (SELECT Berechnung.T_KUNDE.KUN_ID, SUM(Berechnung.T_Position.POS_Umsatz) AS Umsatz FROM Berechnung.T_KUNDE INNER JOIN Berechnung.T_Position ON Berechnung.T_KUNDE.KUN_Id_Ref = Berechnung.T_Position.POS_Kunde_ID WHERE POS_Datum >= 20060101 AND POS_Datum <= 20061231 GROUP BY Berechnung.T_KUNDE.KUN_ID ) as tmp ON Berechnung.T_KUNDE.KUN_ID = tmp.KUN_ID /* wird auch nicht mehr benötigt UPDATE Berechnung.T_KUNDE SET KUN_Umsatz2006 = 0 WHERE KUN_Umsatz2006 IS NULL */ /* IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE OBJECT_ID = OBJECT_ID(N'tmp1') AND TYPE IN (N'U')) DROP TABLE tmp1 */ COMMIT TRANSACTION
Comment
Comment