En fait, une fonctionnalité intéressante de SQL Server 2008 est table valued parameters.
configuration:
create type fooTableType as table (v varchar(50));
go
create proc spFoo(@t fooTableType readonly) as
insert into tbFoo(v) select v from @t
go
alors votre code C# SREG:
declare @t as fooTableType
insert @t(v) values('beyond'),('all'),('recognition')
exec spFoo(@t)
est ici un code C# rude pour le faire:
using (SqlCommand cmd=new SqlCommand()) {
StringBuilder sql = new StringBuilder();
for(int i=0; i<50; i++) {
sql.AppendFormat(",(@v{i})",i);
cmd.Parameters.AddWithValue("@v"+i.ToString(),values[i]);
}
cmd.CommandText = "declare @t as fooTableType; insert @t(v) values" +
sql.ToString().Substr(1) + "; exec spFoo(@t);"
cmd.CommandType = CommandType.Text;
cmd.Connection = myConnection;
cmd.ExecuteNonQuery();
}
Je serais plutôt d'accord qu'une telle optimisation n'est pas absolument nécessaire. Peut-être que c'est OCD mais je ne serais pas capable de le laisser comme une boucle de cmd.ExecuteNonQuery().
Vérifiez le answer de CertifiedCrazy pour une version plus propre du code C#. Notez également que cette technique est limitée à 2 100 paramètres au total - c'est une limitation du protocole TDS sous-jacent.
Pouvez-vous appeler ce sproc à partir du code .NET et si oui, auriez-vous l'affichage en place un code d'exemple qui montre comment? Merci. –
En fait, trouvé: http://msdn.microsoft.com/en-us/library/bb675163.aspx. Bonnes choses –
À mon avis, ce n'est pas aussi bien rangé ou maintenable que d'autres codes. En fait, je préférerais pré-préparer la commande et faire une boucle 50 fois juste en changeant le paramètre. Ou encore mieux, utilisez tvpParam.SqlDbType = SqlDbType.Structured selon la réponse de CertifiedCrazy. – MatBailie