2009-03-23 31 views
0

Ich versuche, eine gespeicherte Prozedur zu schreiben, das ist, was ichgespeicherte SQL-Prozeduren

Create procedure sp_Create_order 
@P_nafn varchar(50), 
@P_fj int, 
@P_sótt datetime, 
@F_kt varchar(10), 
@V_nr int, 
@L_id int 

as 
begin 
    set nocount on 

if exists(
   select * from Lotur 
   where [email protected]_id and 
   @P_sótt between L_hefst and L_pfrest 
) 
INSERT INTO Pantar(P_nafn, P_fj, P_sótt, F_kt, V_nr, L_id) 
VALUES (@P_nafn, @P_fj, @P_sótt, @F_kt, @V_nr, @L_id) 
end 

so weit, aber ich diese Fehler

Msg 102, Ebene 15, Status bekommen 1, Prozedur sp_Create_order, Zeile 14 Falsche Syntax in der Nähe von ''.

Msg 102, Ebene 15, Status 1, Prozedur sp_Create_order, Zeile 15 Falsche Syntax in der Nähe von ''.

auf diesen Linien

select * from Lotur 
where [email protected]_id 

und

@P_sótt, L_hefst und L_pfrest sind alle Termine und ich bin tryng einen Zustand versetzen zu sagen, dass nichts eingefügt werden soll, es sei denn @P_sótt zu gleich oder zwischen L_hefst und L_pfrest

+0

Welche Version und welchen Geschmack von SQL verwenden Sie? Ich konnte dieses Verfahren ohne Fehler in SQL Server 2000 und 2005 erstellen. – harpo

+0

Ich benutze mssql 2005, sobald ich replaced * whith L_id es begann zu arbeiten –

Antwort

1
  • Bitte verwenden Sie aussagekräftige Namen für Ihre Variablen
  • Sie für jede Sache, wie die oben
  • Ändern Sie die Abfrage nicht sp erstellen SELECT L_ID NICHT SELECT *
  • Was den Fehler zu haben, wahrscheinlich haben Sie sich vertippt etwas
+0

Ist die Auswahl * wirklich wichtig, wenn es in einem existiert? –

+0

Die Prozedur wie kompiliert und ausgeführt für mich unter SQL Server 2005 ist möglicherweise ein anderes seltsames Problem. –

+0

Nicht sicher Jeffrey ... Abfrageoptimierer vielleicht in der Lage sein, es zu optimieren, aber immer noch gibt es keinen Grund zu "wählen *" – Albert

0

Vor allem würde ich nicht empfehlen, Ihre Stored Procedure mit sp_ voranstellen. Performance ist mindestens ein Grund, warum es eine schlechte Idee ist.

Ihre gespeicherte Prozedur kompiliert für mich ok. Eine weitere Empfehlung würde

if exists (
    select 1 
    from 
     Lotur 
    where 
     L_id= @L_id 
     and @P_sótt between L_hefst and L_pfrest 
) 

im Gegensatz zu SELECT * zu bedienen. Haben Sie den Fehler beim Kompilieren oder beim Versuch, es zu verwenden, erhalten?

EDIT:

Als Antwort auf Ihren Beitrag über Fehler erhöhen, könnten Sie bei RAISERROR suchen. Hier ist ein example of how to use it in Stored procedures

+0

Ist das immer noch ein Problem mit SQL 2005/2008? Dieser Artikel, auf den Sie verwiesen haben, stammt aus dem Jahr 2001. –

+0

IMHO, sollten Sie sp_ nie zu Beginn Ihrer eigenen gespeicherten Prozeduren verwenden. SQL Server wird immer zuerst in Master suchen –

+0

Führen Sie den Profiler und versuchen Sie es :) Ich fand es der Fall im Jahr 2005 - ich weiß nicht über 2008, aber ich vermute, das gleiche, in Anbetracht MS beraten gegen die Praxis –