2009-05-07 3 views
4

Ich müsste wissen, wie man eine Abfrage analysiert, um zu wissen, ob sie gut erstellt ist, bevor sie ausgeführt wird. Wenn das Parsen korrekt ist, dann führe es aus, wenn es nicht verworfen wird.Wie kann ich dynamisches SQL vor der Ausführung in T-SQL analysieren?

Ich konnte dies mit SET NOEXEC, SET PARSEONLY, TRY/CATCH nicht erreichen.

Ich benutze dynamische sql innerhalb einer Schleife. Manchmal ist die dynamische SQL nicht für meine Schuld falsch, aber für die Informationen in der Datenbank vorhanden. Aus diesem Grund möchte ich es vor der Ausführung analysieren.

+1

In C# -Code? Innerhalb von SQL Server Management Studio? Nicht klar ..... –

+1

Nein, in T-SQL-Code –

Antwort

3

Versuchen Sie es mit SET FMTONLY ON und SET FMTONLY OFF.

SET PARSEONLY ON auf Ihrem Code SET PARSEONLY OFF sollte für die meisten funktionieren.

MSDN FMTONLY

6

Das mit einigen Sp_executesql Tricks möglich sein könnte:

-- The query you would like to parse 
declare @sql nvarchar(max) 
set @sql = 'select 1' 

declare @testsql nvarchar(max) 
declare @result int 
set @testsql = N'set parseonly on; ' + @sql 
exec @result = sp_executesql @testsql 

-- If it worked, execute it 
if @result = 0 
    begin 
    exec sp_executesql @sql 
    end 

Wenn ich eine falsche Abfrage verwenden, wie 'salact 1' ist der @result Wert ungleich Null.

Der TRY/CATCH scheint nicht gut mit sp_executesql zu spielen, also überprüfe ich stattdessen den Rückgabewert.

3

Was möchten Sie erreichen?

Wie bereits erwähnt, wird T-SQL erst kompiliert, wenn die Abfrage analysierbar ist.

Wenn Sie nur einen Weg, um zu überprüfen, haben wollen, dass die Abfrage in Ordnung ist (ex., Um zu überprüfen, dass Sie die where-Anweisung nicht vergessen haben oder so), dann vielleicht wird der Showplan Dir

set showplan_xml on 

helfen Dies teilt dem SQL-Server mit, dass er die Abfrage nur analysiert (die Abfrage selbst wird nie ausgeführt) und den Ausführungsplan dafür zurückgibt. Es wird hauptsächlich für Leistungsprobleme verwendet, kann aber auch als Zeiger verwendet werden, falls bei der Abfrage etwas nicht stimmt.

+1

wunderbare Lösung! Ich habe always setfmony verwendet, aber es ist ein veraltetes Feature in Sql Server 2012 :( –