Podczas uruchamiania skryptu współpracownika widziałem powyższy komunikat „Ostrzeżenie ANSI” (i nie wiem, które z wielu stwierdzeń spowodowało wyświetlenie ostrzeżenia).
W przeszłości ignorowałem to: sam unikam zer, więc wszystko, co je wyeliminowałoby, jest dobrą rzeczą w mojej książce! Jednak dzisiaj słowo „SET” dosłownie krzyknęło na mnie i zdałem sobie sprawę, że nie wiem, jakie znaczenie powinno mieć w tym kontekście.
Moją pierwszą myślą, opartą na tym, że jest wielka, jest to, że odnosi się do SET
słowa kluczowego i oznacza „przypisanie”, jak w
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
Zgodnie z Pomocą programu SQL Server funkcja „ostrzeżeń ANSI” jest oparta na normie ISO / ANSI SQL-92, dla której specyfikacja używa tylko jednego terminu „Ustaw operację” w tytule podsekcji, stąd w przypadku tytułu w sekcja przypisywania danych. Jednak po szybkim przejrzeniu komunikatu o błędzie widzę przykłady, które są SELECT
zapytaniami, które najwyraźniej nie wiążą się z przypisaniem.
Moja druga myśl, oparta na sformułowaniu ostrzeżenia SQL Server, była taka, że implikowane jest matematyczne znaczenie zestawu. Jednak nie sądzę, że agregacja w SQL jest ściśle operacją ustawioną. Nawet jeśli zespół SQL Server uważa, że jest to operacja ustawiania, jaki jest cel umieszczania słowa „set” wielkimi literami?
Podczas przeglądania Google zauważyłem komunikat o błędzie programu SQL Server:
Table 'T' does not have the identity property. Cannot perform SET operation.
Te same słowa „operacja SET” w tym samym przypadku mogą odnosić się tylko do przypisania IDENTITY_INSERT
właściwości, co sprowadza mnie z powrotem do mojej pierwszej myśli.
Czy ktoś może rzucić jakieś światło na tę sprawę?
źródło
SET
jest zawsze pisane dużymi literami jak słowo kluczoweSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
daje 3 inne wyniki, które wydają się wskazywać również naSET
słowo kluczowe.set operations
odnosząc się doUNION
iINTERSECT
aEXCEPT
, ale nie mogę dostać błąd wymyślićNULL
w żadnej z tych okoliczności. Myślę, że może to być starszy komunikat o błędzie.Odpowiedzi:
Właśnie przeglądałem specyfikację SQL-92 i zobaczyłem fragment, który przypomniał mi to pytanie.
W rzeczywistości istnieje określone ostrzeżenie dla tej sytuacji, jak wskazano poniżej
Zakładam, że
SET
w komunikacie o błędzie programu SQL Server jest odniesieniem do funkcji zestawu tego komunikatu o błędzie, chociaż nie jestem pewien, dlaczego wprowadziłoby rozróżnienie między agregacjami a innymi funkcjami zestawu, o ile widzę, że są one synonimami. Odpowiednia część gramatyki znajduje się poniżej.źródło
Szybka odpowiedź
„Inny zestaw * jest prawdopodobnie związany ze starszymi wersjami programu SQL Server.
Kiedyś pracowałem z SQL Server 6.5 i 7, widziałem to jeszcze bardziej, ale minęło trochę czasu. Wiele dziwactw zostało rozwiązanych + SQL Server bardziej odpowiada standardom
Dłużej:
Obecnie wiadomość jest kontrolowana przez
SET ANSI_WARNINGS
domyślną wartośćON
.Odnosi się to wyłącznie do tego, czy
Jeden przykład:
daje
Inny przykład:
Osobiście ignoruję ostrzeżenie i pozostawiam SET ANSI_WARNINGS ON z powodu innych konsekwencji dla kolumn obliczeniowych i indeksowanych widoków ustawienia OFF.
Wreszcie może istnieć wyzwalacz lub kolumna obliczeniowa lub indeksowany widok generujący gdzieś to ostrzeżenie
źródło
SET operation
Bit nie został dodany do 2000 rokuDruga strona ostrzeżenia odnosi się do operacji „set”, a nie do operacji „SET” - co dla mnie wygląda na komunikat o błędzie - na przykład jest on również wytwarzany z funkcjami okienkowania:
źródło
MAX()
select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;
zselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
MAX()
. Myślę, że twój drugi przykład ma więcej do czynienia z kolejnością operacji przy użyciu funkcji okna.