Đây là một câu hỏi cũ nhưng tôi đã đưa ra một giải pháp thanh lịch cho điều này mà tôi thích sử dụng lại và tôi nghĩ rằng mọi người khác sẽ thấy nó hữu ích.
Trước hết, bạn cần phải tạo một FUNCTION
trong SqlServer có đầu vào được phân tách và trả về một bảng có các mục được chia thành các bản ghi.
Dưới đây là đoạn mã sau cho việc này:
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
Bây giờ bạn có thể làm một cái gì đó như thế này:
Select Id, Data from dbo.Split('123,234,345,456',',')
Và đừng sợ, đây không phải có thể dễ bị tấn công SQL injection.
Tiếp theo viết một stored procedure mà mất dữ liệu dấu phẩy của bạn được phân định và sau đó bạn có thể viết một câu lệnh SQL có sử dụng chia chức năng này:
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
Bây giờ bạn có thể viết một C# wrapper xung quanh nó:
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();
}
}
Các điểm liên kết đầu tiên giống với số thứ hai – Matt
Các giải pháp tốt :) – graffic