Mam problem z procedurą T-SQL i mam nadzieję, że możesz pomóc.Procedura T-SQL dająca wynik boolowski
muszę wiedzieć, czy
- A wiersz istnieje w tabeli dla danego ID
- Jeżeli jeden (lub więcej) istnieje wtedy ostatni z nich ma inny identyfikator ustawiony na 5.
Pierwsza tabela, z której chcemy pobrać wiersz, ma dwa odpowiednie identyfikatory: Identyfikator sprawy i Identyfikator lokalizacji, są to liczby całkowite. Druga tabela ma 1 odpowiedni identyfikator o nazwie StateID.
Obecnie mogę sprawdzić, czy wiersz istnieje w części tabeli, ale już wkrótce, gdy spróbuję zrobić wszystko, Enterprise Manager podaje błąd składni przed instrukcją END.
CREATE PROCEDURE [dbo].[HasActiveCase]
(
@LocationID INTEGER
)
AS
DECLARE @CaseID AS INTEGER
SELECT @CaseID=CaseID FROM dbo.Cases WHERE @LocationID=LocationID
SELECT CASE WHEN
@CaseID IS NULL
THEN
0
ELSE
-- do something here to check CaseEvents.StateID is not 5 (closed)
END
GO
Prawdopodobnie istnieje sposób na zdobycie tego, czego potrzebuję w DOŁĄCZU lub coś w tym rodzaju, ale jestem tutaj kompletnym nowicjuszem.
Jaki byłby najłatwiejszy do zrozumienia sposób sprawdzenia identyfikatora StateID, to nie 5 i zwrócenie wyniku jako true/false? (Wiem, że SQLServer nie ma typu boolowskiego, ale zamiast tego ma typ Bit.)
Również w kwestii stylu: Wartości w identyfikatorach mają powiązane z nimi pole tekstowe - CaseEvents.StateID ma na przykład tekst "Zamknięte". Czy należy zwracać wartości jako identyfikatory, a następnie zastępować identyfikator kodem lub zwracać obiekty z identyfikatorami już zastąpionymi przez tekst? Nigdy nie będzie więcej niż 20 lub 30 wyników zwróconych w zestawie i tabela nigdy nie będzie bardzo duża, ponieważ zajęło 5 lat, aby uzyskać 2000 wyników w nim.
UWAGA: Nie można użyć linq (ani niczego innego .NETty), ponieważ zostanie wywołany z programu VB6.
Aktualizacja:
tylko 1 przypadek może być otwarte w czasie, więc tylko najnowsza pozycja byłaby znaczenie.
Możliwe sytuacje mieć to:
- No sprawa nigdy otwarte. Powinno to zwrócić 0.
- Sprawa została poprzednio otwarta, ale została zamknięta. To również powinno zwrócić 0.
- Otwarty przypadek istnieje. Powinno to powrócić 1.
W moim przypadku można mieć tylko 1 przypadek otwarty w momencie, więc sprawdzanie, czy ostatni element jest zamknięciem, wystarczy w tym przypadku. Powinienem to zauważyć w opisie problemu. –
Przepraszam - myślę, że powinienem być bardziej szczegółowy, gdy powiedziałem "sprawdź, czy ostatnia sprawa jest zamknięta" - niekoniecznie jest to najnowsza, kolejność nie będzie konkretna, chyba że wyraźnie dodasz klauzulę ORDER BY. –
Twój to był ten, który działał prosto z pudełka, więc dostajesz kleszcza, nawet jeśli nie jest to najłatwiejsze do zrozumienia. –