2009-05-07 9 views
13

Kiedy generuję skrypty do tworzenia schematów sql ręcznie, zwykle po prostu wywołuję "Create Procedure ...", jednak zauważam, że kiedy generujesz skrypt za pomocą opcji Tasks/Generate Scripts, to używa "spexecutesql @statement = .." np.Dlaczego serwer sql generuje procedury przechowywane za pomocą instrukcji sp_executesql z ciągiem?

EXEC dbo.sp_executesql @statement = N'-- ============================================= 
    -- Author:  Me 
    -- Create date: 20/03/2009 
    -- Description: Does stuff 
    -- ============================================= 
    CREATE PROCEDURE [dbo].[MyProc] 
     -- Add the parameters for the stored procedure here 
     @StartDate datetime 
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 
    ... 
END 
' 

Dlaczego tak jest? Czy chodzi o zatrzymywanie komentarzy? Dzięki

Odpowiedz

18

Nie ma to nic wspólnego z komentarzami. Robi to w ten sposób tylko wtedy, gdy powiesz mu "włącz, czy nie istnieje". Powodem jest to, że może programowo włączać lub wyłączać obiekty, jeśli są one wykonywane dynamicznie.

Możesz wyłączyć to jest procedura przechowywana wybierając "False" w Options \ SQL Server Object Explorer \ Scripting - Sprawdź istnienie obiektu.

+4

Nie jestem pewien, czy to prawda. Często piszę napisy typu "JEŚLI NIE ISTNIEJ" i nie wykonuję skryptów przy użyciu sp_executesql –

+0

Jestem prawie pewien, że podejście nie zadziała dla Alter i tworzy związane z przechowywanymi procedurami –

0

Zgaduję, że ma to związek z możliwością tworzenia wielu sprocs w tym samym pliku skryptu bez GO? Jeśli tworzysz sproc ... bezpośrednio, musisz ukończyć je w partii (zakończyć za pomocą GO). Przy pomocy sp_executesql nie powinieneś mieć konieczności generowania skryptów między obiektami. Chociaż nie pamiętam, być może jest tam jakikolwiek ... (nie mam przed sobą bazy danych).

0

Używanie spexecutesql to najlepsza praktyka. Ma to wpływ na zapobieganie iniekcji sql itp. Przez izolowanie/ograniczanie zakresu zmiennych itp. Więcej tutaj: http://msdn.microsoft.com/en-us/library/ms188001.aspx

NIE MUSISZ używać spexecutesql - działa też EXEC - wiele osób po prostu używa zwykły stary EXEC - to po prostu nie jest tak bezpieczne.

2

Zdaję sobie sprawę, że jest stary, ale poprawka jest pochowana dość głęboko w Sql 2012. Michael Haren ma rację, metoda renderowania sprocs zmienia się, gdy Kontrola Istnienia Obiektu jest wymagana w Opcjach. Aby to zmienić, przejdź do Opcje, Eksplorator obiektów serwera SQL, Skrypty, Opcje skrypowania obiektu, i ustaw "Sprawdź istnienie obiektu" na fałsz. Sprocs renderuje teraz "normalnie", bez użycia sp_executesql.

2

serwer SQL 2012, zestaw Narzędzia => Opcje => SQL Server Object Przeglądaj => Obsługa skryptów, zaznacz obiekt istnienie = false

może rozwiązać ten problem.

+0

Tak! To jest rozwiązanie dla SSMS 2012 – nano

Powiązane problemy