2014-12-30 18 views
7

Angenommen, ich habe eine Abfrage in einer Variablen wie folgt gespeichert (es ist tatsächlich dynamisch bevölkert und komplexer werden, aber das ist zu Demonstrationszwecken):SQL „wenn vorhanden ...“ dynamische Abfrage

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

Gibt es eine Möglichkeit zu überprüfen, ob die Abfrage Ergebnisse zurückgeben würde? So etwas wie dies, aber das funktioniert nicht:

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

Die einzige Möglichkeit, die ich denken kann, dies zu tun ist, die Ergebnisse in einer temporären Tabelle zu setzen und dann von der Abfrage, aber das ist nicht ideal, weil Die Spalten in der dynamischen Abfrage können variieren und ich brauche die temporäre Tabelle aus keinem anderen Grund als nur zu überprüfen, ob einige Zeilen zurückgegeben werden. Gibt es einen besseren Weg?

+0

Dann versuchen Sie mit EXISTS Unterabfrage .... Tun Sie etwas wo existiert (wählen Sie 1 aus dbo.MyTable). Letztendlich überprüfen Sie diese Tabelle, um etwas anderes zu tun, wenn Datensätze in dieser Tabelle vorhanden sind. – knkarthick24

+0

Die Unterabfrage ist dynamisch und wird wie oben gezeigt in einer Variablen gespeichert. 'EXISTS' funktioniert nicht, wenn es dynamisch ist. – mayabelle

Antwort

11

Versuchen Sie, die Dynamic query auszuführen und @@RowCount zu verwenden, um das Vorhandensein von Zeilen zu finden.

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

Versuchen Sie folgendes:

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

Für 'sp_executesql' müßte' @ Query' 'nvarchar' sein – Dan

+0

Sie haben Recht. Ich benutze nur seinen Code. – dario

0

Sie können EXEC verwenden SQL-Anweisung auszuführen, dann @@ROWCOUNT aufrufen, die die Anzahl der Zeilen, die von der letzten Anweisung betroffenen Kosten, Zeile existiert in SQL SELECT stetement zu überprüfen.

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

Beantwortete die gleiche lange Zeit zurück. –

+0

Ich bin beschäftigt, während ich zurückschreibe, du hast geschrieben, herzlichen Glückwunsch. Auch wenn Sie Sp_executesql verwenden, während ich direkte exec verwende – HaveNoDisplayName

2

Ich weiß, dass diese Antwort zu spät ist. aber ich lasse das hier, um jemand anderen zu helfen, IF EXISTS mit einer dynamischen Abfrage zu verwenden.

Dies ist, wie Sie es mit dynamischen Abfragen tun sollten.

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) 

Hoffen, dass dies jemandem geholfen hat. Stimmen Sie, wenn es getan hat :)

Verwandte Themen