2009-03-06 23 views

Odpowiedz

0

Zapisz indywidualne identyfikatory w tabeli B, wszystkie z tym samym "kluczem" (prawdopodobnie GUID).
Następnie zapytanie przeciwko tabeli A obejmowałyby

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

(Można następnie usuń klucze jeśli zakończeniu pracy z nimi. Lub timestamp je i mają sql zadanie zrobić to później).

Plusy:

  • nie wysyłać ciąg, co może narazić użytkownika na sQL Injection w pewnych okolicznościach.
  • W zależności od twojej innej logiki aplikacji, nie musisz śledzić ani pisać wszystkich możliwości naraz.

Wady:

  • To może być bardzo nieefektywne, szczególnie przy dużych obciążeniach.
11

Z SQL2005 i powyżej można wysłać tablicę bezpośrednio z kodu.

Najpierw utwórz niestandardowy typ

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

niż procedura przechowywana.

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

Potem zadzwoń z kodu przechodzącą w DataTable jako tablicy

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

Dotyczy tylko serwera Sql 2008. –

Powiązane problemy