2009-03-06 9 views
13

Comment puis-je construire une procédure stockée qui me permettra de passer (par exemple) un @IDList afin que je puisse écrire:« dans » la liste via la procédure stockée

Select * from Foo Where ID in @IDList 

Est-ce faisable?

+0

Quelle base de données utilisez-vous? De quelle langue passez-vous la liste? – bstoney

Répondre

0

Ecrivez les identifiants individuels dans la table B, tous avec la même "clé" (un GUID peut-être).
Ensuite, votre requête sur le tableau A comprendrait

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

(Vous pourriez alors supprimer les clés si vous avez terminé avec eux. Ou, les horodater et ont un emploi sql faire plus tard.)

Plus:

  • vous n'envoyez pas une chaîne, ce qui pourrait vous exposer à l'injection sql dans certaines circonstances.
  • En fonction de votre logique d'application, vous n'avez pas besoin de suivre ou d'écrire toutes les possibilités en même temps.

Moins:

  • Il pourrait être extrêmement inefficace, en particulier sous de lourdes charges.
11

Avec SQL2005 et au-dessus, vous pouvez envoyer un tableau à partir du code directement.

d'abord créer un type personnalisé

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

Que la procédure stockée.

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

Ensuite, appelez à partir du code qui passe dans un DataTable que le tableau

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

Ceci s'applique uniquement à Sql Server 2008. –

Questions connexes