Используйте табличную переменную:
DECLARE @Ids TABLE (ID INT);
INSERT @Ids VALUES (12964),(12965),(12966);
SELECT *
FROM tblBooks
WHERE BookID in (SELECT ID FROM @Ids);
Если вам нужно передать это в порядке, то вы можете использовать таблицу оцененный параметр:
CREATE TYPE dbo.ListOfInt AS TABLE (ID INT);
GO
CREATE PROCEDURE dbo.GetBooks @IDs dbo.ListOfInt READONLY
AS
BEGIN
SELECT *
FROM tblBooks
WHERE BookID in (SELECT ID FROM @Ids);
END
GO
DECLARE @IDs dbo.ListofInt;
INSERT @Ids VALUES (12964),(12965),(12966);
EXECUTE dbo.GetBooks @Ids;
Или От C#
var table = new DataTable();
table.Columns.Add("ID", typeof(int));
// ADD YOUR LIST TO THE TABLE
using (var connection = new SqlConnection("Connection String"))
using (var command = new SqlCommand("dbo.GetBooks", connection))
{
command.CommandType = CommandType.StoredProcedure;
var param = new SqlParameter("@Ids", SqlDbType.Structured);
param.TypeName = "dbo.ListofInt";
param.Value = table;
command.Parameters.Add(table);
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
// do something
}
}
}
Как только ТИП находится на месте, вам даже не нужно использовать хранимую процедуру. Вы можете просто вызвать обычный запрос:
using (var connection = new SqlConnection("Connection String"))
using (var command = new SqlCommand("SELECT * FROM tblBooks WHERE BookID IN (SELECT ID FROM @IDs)", connection))
{
var param = new SqlParameter("@Ids", SqlDbType.Structured);
param.TypeName = "dbo.ListofInt";
param.Value = table;
command.Parameters.Add(table);
connection.Open();
// ETC
}
Doing раскол в C# с помощью String.Split()
и проходящего список в SQL будет более эффективным, чем любой подход, который делает раскол в SQL
Если 'id' является целым числом, то почему вы пытаетесь пройти их как «варчар»? –
Я прохожу через приложение C#. – Mickel
http://www.sommarskog.se/arrays-in-sql-2008.html –