Natrafiłem dzisiaj na interesujący problem. Zmieniłem procedurę przechowywaną i umieściłem oświadczenie select na samym końcu. Miało to być tymczasowe i tylko do pracy z danymi. Byłem zaskoczony, gdy dowiedziałem się, że oświadczenie zostało zapisane i było wykonywane za każdym razem, gdy SP działał.Oświadczenia po END w procedurze przechowywanej
SET ANSI_NULLS ON
GO
-- Comments usually go here and are saved as part of the SP
ALTER PROCEDURE [dbo].[MySP]
@param INT
AS
BEGIN
--Your normal SQL statements here
END
--You can also add SQL statements here
select * from LargeTable
--You have access to the params
select @param
To ma sens, że wszystko jest zapisane, nie tylko to, co jest wewnątrz BEGIN/END, inaczej komentarze i SET ANSI_NULLS
itp zniknie. Jestem trochę mylić z tym, co zaczyna się tam gdzie, więc mam kilka pytań:
SET ANSI_NULLS
zostanie zapisany jako część SP. Potwierdziłem, że każdy SP ma swoją własną wartość. W jaki sposób SQL Server wie o tym, aby zapisać to jako część SP, ponieważ nie zostało wcześniej przywołane? Czy wykonuje pełne skanowanie bieżącego stanu środowiska, a kiedy uruchomi sięALTER PROCEDURE
, zapisze stan (prawdopodobnie tylko wartości inne niż domyślne)?- Podobno BEGIN/END są opcjonalne i nie mają żadnego istotnego znaczenia. Dlaczego są one wliczone w cenę? Dają fałszywe poczucie zakresu, który nie istnieje. Wydaje mi się, że nie ma BEGIN/END, a GO na końcu miałoby sens.
BEGIN/END są używane dla zakresu, podobnie jak zawierające wiele instrukcji w IF/WHILE/etc. Szczerze mówiąc, TSQL jest okropny do pracy w porównaniu do PLSQL - który jest znacznie bardziej uporządkowany/zorganizowany w tym, jak używa BEGIN/END, i używa średników do kończenia linii. Podobnie jak TSQL wymaga średnika przed znakiem WITH/CTE, jeśli zadeklarujesz zmienne przed nim ...:/Każdy, kto ma doświadczenie w języku C, może otrzymać PLSQL i być w stanie go przeczytać. Nie mogę tego powiedzieć dla TSQL ... –
@OMG - Więc jaki "zakres" to daje w tym przypadku? Mogę sobie tylko wyobrazić, że jeśli zadeklarujesz zmienną wewnątrz BEGIN/END, nie będzie ona dostępna na zewnątrz. Dlaczego kiedykolwiek wypuścisz instrukcje SQL na zewnątrz? dlaczego nie chcesz umieścić wszystkiego na zewnątrz i bez BEGIN/END? –
Przykład jest ważny, nie powiedziałem, że był mądry;) –