2009-03-06 19 views

Antwort

0

Schreiben Sie die einzelnen IDs in Tabelle B, alle mit dem gleichen "Schlüssel" (vielleicht eine GUID).
würde dann

where ID in (select ID from B where key = @TempKey) 

umfassen, Ihre Abfrage Tabelle A (Sie könnten dann die Schlüssel löschen, wenn Sie mit ihnen fertig sind. Oder sie Zeitstempel und eine SQL-Job es später tun.)

Vorteile:

  • Sie eine Zeichenfolge nicht senden, die Sie Injektion auf sQL unter bestimmten Umständen aussetzen könnte.
  • Abhängig von Ihrer anderen App-Logik müssen Sie die Möglichkeiten nicht auf einmal verfolgen oder schreiben.

Nachteile:

  • Es könnte äußerst ineffizient sein, vor allem bei hohen Belastungen.
11

Mit SQL2005 und über ein Array von Code direkt senden kann.

Sie zuerst einen benutzerdefinierten Typ

CREATE TYPE Array AS table (Item varchar(MAX)) 

als die gespeicherte Prozedur.

CREATE PROCEDURE sp_TakeArray 
    @array AS Array READONLY 
AS BEGIN 
    Select * from Foo Where ID in (SELECT Item FROM @array) 
END 

Dann von Code aufrufen als die Anordnung in einer Datatable vorbei

DataTable items = new DataTable(); 
items.Columns.Add("Item", typeof(string)); 

DataRow row = items.NewRow(); 
row.SetField<string>("Item", <item to add>); 
items.Rows.Add(row); 

SqlCommand command = new SqlCommand("sp_TakeArray", connection); 
command.CommandType = CommandType.StoredProcedure; 
SqlParameter param = command.Parameters.Add("@Array", SqlDbType.Structured); 
param.Value = items; 
param.TypeName = "dbo.Array"; 

SqlDataReader reader = command.ExecuteReader(); 
+0

Dies gilt nur für SQL Server 2008. –