2014-12-30 22 views
7

Załóżmy, że mam kwerendy przechowywane w zmiennej tak (to faktycznie dynamicznie zaludnionych i bardziej skomplikowane, ale jest to dla celów demonstracyjnych):SQL „jeśli istnieje ...” dynamiczne zapytania

DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable' 

Czy istnieje sposób sprawdzenia, czy zapytanie zwróci jakiekolwiek wyniki? Coś takiego, ale to nie działa:

IF EXISTS (@Query) 
BEGIN 
    -- do something 
END 

Jedyny sposób, że mogę myśleć, aby to zrobić, aby umieścić wyniki w tabeli temp, a następnie zapytanie od tego, ale to nie jest idealny, ponieważ kolumny w kwerendzie dynamicznej mogą być różne i naprawdę nie potrzebuję tabeli tymczasowej w ogóle z jakiegokolwiek powodu poza sprawdzeniem, czy niektóre wiersze zostaną zwrócone. Czy istnieje lepszy sposób?

+0

Następnie spróbuj z podzapytaniem EXISTS .... Zrób coś tam, gdzie istnieje (wybierz 1 z dbo.MyTable). Ostatecznie sprawdzasz tabelę, aby zrobić coś innego, gdy istnieją zapisy w tym stole. – knkarthick24

+0

Podzapytowanie jest dynamiczne, przechowywane w zmiennej, jak pokazano powyżej. 'EXISTS' nie działa, gdy jest dynamiczny. – mayabelle

Odpowiedz

11

Spróbuj wykonać i użyj @@RowCount, aby znaleźć istnienie wierszy.

DECLARE @Query NVARCHAR(1000) = 'SELECT * FROM [dbo].[Mytable]', 
     @rowcnt INT 

EXEC Sp_executesql @query 

SELECT @rowcnt = @@ROWCOUNT 

IF @rowcnt > 0 
    BEGIN 
     PRINT 'row present' 
    END 
8

Spróbuj tego:

DECLARE @Query NVARCHAR(1000) = 'SELECT @C = COUNT(*) FROM dbo.MyTable' 
DECLARE @Count AS INT 
EXEC sp_executesql @Query, N'@C INT OUTPUT', @[email protected] OUTPUT 

IF (@Count > 0) 
BEGIN 

END 
+1

Dla 'sp_executesql',' @ Query' musi być 'nvarchar' – Dan

+0

Masz rację. Po prostu używam jego kodu. – dario

0

Można użyć EXEC aby wykonać sql, a następnie zadzwonić @@ROWCOUNT która zwraca liczbę wierszy dotkniętych ostatnim oświadczeniu, by sprawdzić wiersz istnieje w SQL SELECT stetement.

DECLARE @Query VARCHAR(1000) = 'SELECT * FROM dbo.MyTable',@hasRow int 
EXEC (@Query) 
SELECT @hasRow [email protected]@ROWCOUNT // Returns the number of rows affected by the last statement 
PRINT @hasRow 

IF @hasRow > 0 
BEGIN 
    Print 1 
END 
BEGIN 
    Print 2 
END 
+1

Odpowiedziałem tak samo dawno temu. –

+0

Jestem zajęty, gdy odpisuję, napisałeś, gratulacje. nawet używasz Sp_executesql, gdy używam bezpośredniego exec – HaveNoDisplayName

2

Wiem, że ta odpowiedź jest za późna. ale, pozostawiam to tutaj, aby pomóc komuś innemu użyć IF EXISTS z zapytaniem dynamicznym.

Tak powinieneś robić w dynamicznych zapytaniach.

DECLARE @Query VARCHAR(MAX) 

SET @Query = 'SELECT * FROM [dbo].[MyTable]' 

SET @Query = 'IF EXISTS (' + @Query + ') 
       BEGIN 
        -- do something 
        print ''1'' 
       END 
      ELSE 
       BEGIN 
        -- do something else 
        print ''0'' 
       END 
      ' 

exec (@Query) 

Mam nadzieję, że to pomogło komuś. Głosuj jeśli to zrobiło :)