2009-03-06 9 views

risposta

0

Scrivi i singoli ID nella tabella B, tutti con la stessa "chiave" (forse un GUID).
Quindi, la query contro il tavolo Una includerebbe

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

(Si potrebbe quindi eliminare le chiavi se si è finito con loro. Oppure, li timestamp e hanno un lavoro sql farlo in seguito.)

Pro:

  • non si invia una stringa, che potrebbe esporre l'utente a SQL Injection in alcune circostanze.
  • In base all'altra logica dell'app, non è necessario tracciare o scrivere tutte le possibilità contemporaneamente.

Contro:

  • Potrebbe essere estremamente inefficiente, soprattutto in presenza di carichi pesanti.
11

Con SQL2005 e soprattutto è possibile inviare una matrice da codice direttamente.

Innanzitutto creare un tipo personalizzato

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

Than la stored procedure.

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

Quindi chiamare dal codice di passaggio in un DataTable, come la matrice

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

È applicabile solo al server Sql 2008. –

Problemi correlati