Procedura składowa

0

Muszę napisać procedurę (dla MS SQL), która zwraca wyniki z jakiejś tabelki lub 'Brak danych', gdy nic nie ma.

Mam coś takiego:

IF exists (select * from T)
  select * form T
ELSE select 'Brak danych'

Jak to zapisać, aby nie wykonywać dwa razy select'a?

0

Ja taki problem zawsze rozwiązuje w ten sposób:

select * into #temp from Tabela
	
if @@rowcount > 0		
   select * from #temp
else
   select 'brak danych'

Nie wiem czy istnieje sposób aby wykonać to za pomocą jednego zapytania.

0

Da się to jakoś wykonać za pomocą zmiennej typu tabelarycznego?
Nigdy nie używałem takiej zmiennej, więc nie wiem jak to dokładnie zrobić.

0
IF exists (select 1 from T)
  select * form T
ELSE select 'Brak danych'

Zapytanie w Exists jest wykonywane zupelnie inaczej niz to ktore ma zwracac dane. Optymalizator nie sięga wtedy bezposrednio do danych, nie zwraca nic tylko patrzy czy cos tam jest. "Select 1" zamiast "select *" to zabieg również celowy, można zauważyć pewien wzrost wydajnosci. Także nie ma się co stresować i stosować tak jak napisałeś.

0

Dzisiaj sprawdziłem i da się to zrobić za pomocą zmiennych tabelarycznych.

DEFINE @Zmienna Table (
      id int,
      name varchar
)

INSERT INTO @Zmienna
SELECT id, name
FROM T

IF @@rowcount > 0
     SELECT * FROM @Zmienna
ELSE
     SELECT 'Brak danych'

Główną zaletą takiego podejścia jest to, że nie trzeba powtarzać treści SELECTa. U mnie miał on kilkanaście linii i musiałbym je dwa razy powtórzyć w kodzie.
Przy każdej zmianie musiałbym pamiętać, aby zmienić w obydwu miejscach.

0

A nie prościej użyć mojego sposobu?

select id, name into #temp from T

Nie musisz tworzyć zmiennej i dbać o odpowiednią strukturę tabeli (w przypadku zmiany pól zwracanych przez selecta musisz zmienić definicje zmiennej tablicowej).

0

... inna sprawa że zwracanie "Brak danych" jeśli nie ma rzeczywiście wyników jest całkowicie fatalnym pomysłem .. - źle zaprojektowane i przemyślane.

Ale.. jak to mówią - chciał.. to ma.

1 użytkowników online, w tym zalogowanych: 0, gości: 1