Procédure stockée pour la sélection de plusieurs loggings

J'ai besoin de sélectionner les loggings de 2000 à partir d'une table avec un horodatage correspondant à partir du code c # .net. Par exemple:

SELECT * FROM ITEMDATA_TABLE WHERE ITEMNAME='Item1' and TimeStamp='2010-04-26 17:15:05.667' 

La requête ci-dessus doit s'exécuter pour 2000 éléments de plus pour le même horodatage.

pour cela, nous pouvons utiliser

 SELECT * FROM ITEMDATA_TABLE WHERE ITEMNAME in ('Item1','Item2','Item3','Item4',......) AND TimeStamp='2010-04-26 17:15:05.667' 

à partir de SQL Server Management Studio.

J'ai essayé d'append tous les noms d'élément à une variable de string et de le donner en tant que paramètre à la procédure stockée, mais cela a entraîné une mauvaise concaténation.

Comment puis-je faire cela en tant que procédure stockée s'exécutant à partir du code .net? Quelqu'un peut-il me suggérer / corriger moi en faisant cela?

Si vous utilisez SQL Server 2008 (vous n'avez pas mentionné votre version), vous pouvez utiliser des parameters de type table .

Si vous utilisez SQL Server 2005 ou version ultérieure, consultez les excellents articles d' Erland Sommarskog sur la gestion des lists de parameters dans les procédures stockées.

Vous ne pouvez pas simplement transmettre ces informations en tant que string – cela ne fonctionne pas.

Si je le fais à partir d'une procédure stockée, je créerais une table temporaire de tous les noms d'éléments valides, insert dans cela (ie: une seule table), et faire une requête en tant que primaire, joint au maître où IDs / DateTime qualifié. Puis supprimez la table temporaire.

Suivant peut être le code que vous searchz:

 SET @SQLSsortingng = N'SELECT * FROM table1 WHERE timet = @time and items in (@item)'; DECLARE @SQLSsortingng nvarchar(500); DECLARE @ParmDefinition nvarchar(500); SET @ParmDefinition = N'@time timestamp, @item varchar(max) '; EXECUTE sp_executesql @SQLSsortingng ,@ParmDefinition ,@time = '2010-04-26 17:15:05.667' ,@item = '''Item1'',''Item2'',''Item3'',''Item4''' ; 

ne pas vous dire de le faire d'une autre manière, mais cela ne serait-il pas plus facile si vous sélectionniez tous les éléments avec l'horodatage que vous searchz et que vous réitériez cet set d'loggings dans votre code c #?

Dans SQL 2005, vous pouvez passer la list d'éléments en tant que paramètre XML à la procédure stockée, puis écrire une requête sur le paramètre xml. quelque chose comme ça

SELECT ItemData_Table. * FROM ItemData_Table CROSS APPLIQUER MyxmlParameter.nodes ('item') data (i) O WH ItemData_Table.ItemId = i.value ('@ itemid', INT)

Ici MyxmlParameter est le XML que vous avez passé de votre code .NET à la procédure stockée.