C'est une vieille question mais j'ai trouvé une solution élégante pour cela que j'aime réutiliser et je pense que tout le monde la trouvera utile.
Tout d'abord vous devez créer un FUNCTION
dans SqlServer qui prend une entrée délimitée et retourne une table avec les éléments divisés en enregistrements.
Voici le code suivant pour cela:
ALTER FUNCTION [dbo].[Split]
(
@RowData nvarchar(max),
@SplitOn nvarchar(5) = ','
)
RETURNS @RtnValue table
(
Id int identity(1,1),
Data nvarchar(100)
)
AS
BEGIN
Declare @Cnt int
Set @Cnt = 1
While (Charindex(@SplitOn,@RowData)>0)
Begin
Insert Into @RtnValue (data)
Select
Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))
Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
Set @Cnt = @Cnt + 1
End
Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END
Vous pouvez maintenant faire quelque chose comme ceci:
Select Id, Data from dbo.Split('123,234,345,456',',')
Ne craignez pas, cela ne peut pas être sensible aux attaques par injection Sql.
suivant écrire une procédure stockée qui prend vos données séparées par des virgules et vous pouvez écrire une instruction SQL qui utilise cette fonction Split:
CREATE PROCEDURE [dbo].[findDuplicates]
@ids nvarchar(max)
as
begin
select ID
from SomeTable with (nolock)
where ID in (select Data from dbo.Split(@ids,','))
end
Maintenant, vous pouvez écrire un wrapper C# autour:
public void SomeFunction(List<int> ids)
{
var idsAsDelimitedString = string.Join(",", ids.Select(id => id.ToString()).ToArray());
// ... or however you make your connection
var con = GetConnection();
try
{
con.Open();
var cmd = new SqlCommand("findDuplicates", con);
cmd.Parameters.Add(new SqlParameter("@ids", idsAsDelimitedString));
var reader = cmd.ExecuteReader();
// .... do something here.
}
catch (Exception)
{
// catch an exception?
}
finally
{
con.Close();
}
}
Le premier lien pointe vers le même que le second – Matt
Bonnes solutions :) – graffic