Wykonanie procedury MS SQL

0

Witam,

mam procedurę w pliku SQL wraz z execut
CREATE PROCEDURE LD @A INT, @ROK INT AS SELECT .... FROM ......... WHERE.... ORDER BY .....; GO EXEC LD @A=1,@ROK=2017 GO

Po wykonaniu której drugi raz pojawia się Message:

Msg 137, Level 15, State 2, Procedure LD, Line 5
Must declare the scalar variable "@ROK".

Dlaczego tak jest? co robię nie tak? Jeśłi zmienię nazwę procedury to błędu nie ma za pierwszym razem.

0

Cos mi nie pasuje, błąd jest w procedurze, a nie w execu.

0

Teraz mam komunikat po drugim i kolejnym wykonaniu. Przy pierwszym wykonaniu jest OK.
Msg 2714, Level 16, State 3, Procedure LB, Line 1
There is already an object named 'LB' in the database.

0

Dlatego mi coś nie pasowało:

Jeżeli wykonujesz skrypt:

CREATE PROCEDURE LD @A INT, @ROK INT 
AS 
SELECT .... FROM ......... WHERE.... ORDER BY .....; 
GO 
EXEC LD @A=1,@ROK=2017 
GO

To za pierwszym razem tworzysz procedurę i ją uruchamiasz.

Kolejne puszczenie to tworzenie ponownie tej samej procedury, a nie da się utworzyć drugi raz obiektu o tej samej nazwie, czyli masz komunikat, że obiekt istnieje.

Po utworzeniu musisz już wykonać tylko odpalenie samej procedury:

EXEC LD @A=1,@ROK=2017 
GO

Jeżeli natomiast pracujesz na ciałem procedury i chcesz wprowadzać zmiany to musisz robić ALTER:

ALTER PROCEDURE LD @A INT, @ROK INT 
AS 
SELECT .... FROM ......... WHERE.... ORDER BY .....; 
GO 
0

Daje DROP po EXEC i śmiga :)
Czy w Managament Studio mogę w wersji "klikajacej" usunąć tą procedurę? Gdzie jest przechowywana?

Dzięki.

1

Tak w Object Explorer rozwijasz bazę danych i przechodzisz Programmability->Stored Procedures, prawy klik na procedurze i Delete.

Jeżeli nie widzisz procedury to prawy klik na Stored Procedures i Refresh
Prościej dodać w skrypcie:

IF (OBJECT_ID('LD') IS NOT NULL)
  DROP PROCEDURE LD
GO

Taka uwaga na przyszłość: Samo usuwanie obiektów na bazie produkcyjnej nie jest najlepszym pomysłem, więcej profitów przynosi taki skrypt:

IF (OBJECT_ID('LD') IS NULL)
     exec('CREATE PROCEDURE [dbo].[LD] AS BEGIN SET NOCOUNT ON; END')
GO
ALTER PROCEDURE LD @A INT, @ROK INT 
AS 
SELECT .... FROM ......... WHERE.... ORDER BY .....; 
GO 
EXEC LD @A=1,@ROK=2017 
GO

Najważniejsze zalety:

  • nie masz momentu w bazie kiedy procedura nie będzie dostępna
  • nie niszczysz uprawnień nadanych do obiektu
  • jak coś pójdzie nie tak z alterem to procedura pozostanie dostępna

1 użytkowników online, w tym zalogowanych: 0, gości: 1