2012-03-27 5 views
1

Ich schreibe ein Programm in C#, das einige Auswahlanweisungen unter Verwendung von Parametern ausführt, die an sp_executesql übergeben werden. Ein Problem, mit dem ich beim Testen konfrontiert werde, ist, dass die Werte der Parameter am Ende der Anweisung angegeben werden und nicht explizit angegeben werden, unabhängig davon, ob ich die von SQL Profiler oder von einer Uhr in Visual Studio ausgeführten Befehle erhalte. Zeile in der Abfrage. Zu Testzwecken möchte ich schnell die Parameterwerte für die Parameter ersetzen.Schnelle Möglichkeit, Parameter explizit in einer sp_executesql-Anweisung zu ersetzen?

Anstatt also:

exec sp_executesql N' 
SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId <> @CustomerId 
AND ct.ItemId <> @ItemId 
AND ct.TransactionId = @TransactionId' 
,N'@CustomerId bigint,@ItemId nvarchar(1),@TransactionId nvarchar(30), @CustomerId = 3000, @ItemId = N'4', @TransactionId=N'43281' 

Ich möchte:

exec sp_executesql N' 
SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId = 3000 
AND ct.ItemId <> N'4' 
AND ct.TransactionId = N'43281'' 

Bitte nicht zu viel Aufmerksamkeit auf die Syntax des Beispiels bezahlen, da sie gerade verwendet wird, das demonstrieren Konzept. Kennt jemand einen schnellen Weg, dies zu tun? Grundsätzlich möchte ich es zu Testzwecken ersetzen lassen, da es mir leichter macht, Bedingungen zu modifizieren, um zu testen, wie sie die zurückgegebenen Ergebnisse beeinflussen. Ich würde jede Hilfe schätzen, die jeder geben kann. Vielen Dank.

+1

Sie können die Liste der Parameter manuell durchgehen und ihre Werte in die Abfrage einfügen. Andernfalls sind Parameter eine Optimierung, die auf der SQL-Engine-Ebene behandelt wird, und es gibt keine Möglichkeit, die interne Abfrage abzufangen, die SQL zur Verarbeitung verwendet. Können Sie den C# -Code bereitstellen, den Sie verwenden, um den dynamischen SQL-Befehl zu generieren? – mellamokb

Antwort

3

Parameterized Sp_executesql hat viele Vorteile, einschließlich

  • Durch explizite Parametrierung Sie die Möglichkeit, für SQL geben anständige Abfragepläne auf bestimmte Arten cachen
  • Durch die Parametrierung es Gemeinheiten zu verhindern wie SQL-Injection-Attacken hilft, aber vermeidet auch die Notwendigkeit, problematischen Charakteren zu entkommen.

Also selbst wenn Sie zu ‚unparameterize‘ der erzeugten Sp_executesql verwalte, wenn Sie den Inline-SQL ausführen, der Abfrage-Plan auf die parametrisierte Version deutlich anders sein könnte, und Sie müßten auch etc tun zu entkommen (dh es wäre nicht geeignet für Äpfel vs Äpfel testen).

Der einzige Grund, warum ich denken kann, warum Sie nicht möchten, dass parametrisierte sp_executesql für die Lesbarkeit einfach wäre?

bearbeiten: auf wäre abhängig zu ersetzen versuchen, welche Technologie Sie

Wie @mellamokb verwenden vorgeschlagen, wenn Sie ExecuteReader verwenden diese ganz einfach

Angenommen, Ihr Code war so etwas wie

sein könnte
string sqlCmd = "SELECT CustomerName 
FROM CustomerTable ct WITH(NOLOCK) 
WHERE ct.CustomerId <> @CustomerId 
AND ct.ItemId <> @ItemId 
AND ct.TransactionId = @TransactionId"; 

cmd.CommandText = sqlCmd; 
cmd.CommandType = CommandType.Text; 
cmd.Parameters.Add(new SqlParameter("CustomerId", DbType.Int32, myCustomerId)); 
cmd.Parameters.Add(new SqlParameter("ItemId", DbType.String, myItemId)); 
.. 
cmd.ExecuteReader() 

Sie könnten dann Code fügen Sie Ihre Test-Abfrage zu erstellen:

jedoch ein ORM wie Linq2SQL oder EF wäre nicht so einfach sein

customerTable.Where(c => (c.CustomerId != myCustomerId) && (c.ItemId != myItemId) && (c.TransactionId == myTransactionId)) 

Möglicherweise ein Tool wie LinqPad helfen könnte?

+0

Danke für die Antworten.Ja, als ich das Problem untersuchte, habe ich ein wenig darüber gelesen, wie die Ausführung von SQL-Befehlen mit sp_executesql bestimmte Effizienzen ermöglicht, wenn eine große Anzahl von Abfragen ausgeführt wird. Intern möchte ich den Code gleich behalten. Nur zum Testen möchte ich jedoch die SQL-Befehle mit den bereits ersetzten Parametern erzeugen lassen können. Kann ich vorübergehend einen anderen SQL-Befehl verwenden (z. B. sp_executesql und dann möglicherweise einen anderen Codeblock, mit dem ein leserfreundlicherer Ausdruck ausgegeben wird, den ich später auskommentieren kann)? – user1202747

+0

Danke, die Ersatzidee hat funktioniert. – user1202747

Verwandte Themen