risposta-alla-domanda-sullo-sviluppo-web-bd.com

SQL "se esiste ..." query dinamica

Supponiamo che io abbia una query memorizzata in una variabile come questa (in realtà è popolata dinamicamente e più complessa, ma questo è a scopo dimostrativo):

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

C'è un modo per verificare se la query restituirà risultati? Qualcosa di simile, ma questo non funziona:

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

L'unico modo che posso pensare di fare questo è mettere i risultati in una tabella temporanea e poi eseguire una query, ma non è l'ideale, perché le colonne nella query dinamica possono variare e in realtà non ho bisogno della tabella temporanea per nessuna ragione se non quella di verificare se alcune righe sarebbero state restituite. Esiste un modo migliore?

10
mayabelle

Prova ad eseguire Dynamic query e usa @@RowCount per trovare l'esistenza delle righe.

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 
15
Pரதீப்

Prova questo:

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
8
dario

So che questa risposta è troppo tardi. ma, lo lascio qui per aiutare qualcun altro a usare IF EXISTS con una query dinamica.

Questo è come dovresti farlo con le query dinamiche.

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)

Spero che questo abbia aiutato qualcuno. Vota se l'ha fatto :)

2
Sam

È possibile utilizzare EXEC per eseguire l'istruzione sql, quindi chiamare @@ROWCOUNT che restituisce il numero di righe interessate dall'ultima istruzione, per verificare che la riga esista in sql selezionare 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
0