2011-12-22 14 views
20

Próba przypisania zmiennej wewnątrz jeśli istnieje zapis dla TSQLPrzypisanie zmiennej wewnątrz IF EXISTS klauzuli

DECLARE @myvar int 

IF EXISTS (SELECT @myvar = theTable.varIWant.....) 

myślałem, że to będzie działać, ale najwyraźniej nie? A może (bardziej prawdopodobne) robię to źle.

+1

Ok mój prostsze obejście, które używam to SELECT @myvar = .... i potem zrobić IF (@myvar <> NULL) . To rozwiązuje mój problem, a nawet czyni go bardziej logicznym, ale nadal jestem zainteresowany, aby wiedzieć, czy mogę go przypisać. –

+1

Zgaduję, że nie, ponieważ instrukcja przypisania nie zwraca wartości boolowskiej, która spełnia IF EXISTS – Sparky

Odpowiedz

20

W mojej instalacji SQL Server 2008 R2 po prostu się nie kompiluje. Analizator składni narzeka na nieprawidłową składnię w pobliżu =.

Wierzę, że musi mieć coś wspólnego z miksowaniem wartości i pobieraniem danych w pojedynczej instrukcji SELECT, która jest niedozwolona w SQL Server: możesz mieć jedną lub drugą. Ponieważ przy przypisywaniu wartości zestaw wierszy nie jest zwracany, ale predykat EXISTS oczekuje, że jest to zadanie niemożliwe, w celu uniknięcia niejasności ograniczenie to musiało zostać nałożone jawnie.

Twoje obejście, o którym mowa w komentarzu, jest przyzwoite, ale może nie działać dobrze w środku partii, gdy zmienna ma już wartość przed przypisaniem. Więc to pewnie użyć tego obejścia zamiast:

SELECT @myvar = ... 
IF @@ROWCOUNT > 0 ... 

As per MSDN funkcja systemu @@ROWCOUNT zwraca liczbę wierszy czytanych przez zapytanie.

+0

+1 dla używania '@@ ROWCOUNT' – rabudde

+0

Hmm, co jest semantycznie lepsze. To odpowiedź od Michaela Pettera? –

+0

@ Jeff.Clark: Semantycznie - nie jestem pewien. Moje ma sens dla mnie i nie widzę żadnych problemów, z logicznego punktu widzenia, z opcją zaproponowaną przez Michaela Pettera. Jest jeden potencjalny problem innego rodzaju z jego rozwiązaniem i wyraziłem to w mojej odpowiedzi. (Zobacz akapit, w którym omawiam obejście OP, które jest zasadniczo takie samo jak sugestia Michaela.) –

1

Nie zadziała tylko dlatego, że w konstrukcji EXISTS serwer sql sprawdza poprawność wiersza i nie ma znaczenia sekcja wyboru kolumn lub przypisania. Służy to do optymalizacji wydajności.

-2

Czy próbowałeś policzyć?

SELECT @Exists = CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END 
FROM [dbname].[dbo].[tableorviewname]; 
7

Zamiast robić IF EXISTS, można po prostu zrobić

DECLARE @myvar int 
SELECT @myvar = theTable.varIWant.....; 
IF @myvar IS NULL 
BEGIN... 
Powiązane problemy