Ну, в зависимости от того, какую версию SQL вы используете, существует третий вариант, который очень прост.Если вы используете SQL 2008, тогда вы можете создать пользовательский тип таблицы.
CREATE TYPE [dbo].[IntegerList] AS TABLE(
[n] [VARCHAR(100)] NOT NULL,
PRIMARY KEY CLUSTERED
(
[n] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
Я использовал это с целыми числами, но я не понимаю, почему вы не могли просто изменить тип на varchar.Затем вы используете его следующим образом:
CREATE PROCEDURE [dbo].[CheckIds]
@Ids IntegerList READONLY
AS
BEGIN
SELECT *
FROM [dbo].[Table]
WHERE [Id] IN (SELECT n FROM @Ids)
END
Затем в вашем .net-коде вы устанавливаете его так:
int[] Ids = <You id array>
var IdList = new List<SqlDataRecord>();
SqlMetaData[] tvp_definition = { new SqlMetaData("n", SqlDbType.Int) };
foreach (int Id in Ids)
{
var rec = new SqlDataRecord(tvp_definition);
rec.SetInt32(0, Id);
IdList.Add(rec);
}
Затем передаете его как параметр, как обычно, для хранимого вызова procза исключением некоторых небольших изменений:
sqlCommand.Parameters.Add(new SqlParameter { ParameterName = "@Ids", SqlDbType = SqlDbType.Structured, TypeName = "IntegerList", Value = IdList });
Может показаться, что это много, но на самом деле это не так.Это действительно чистый и без лишнего кода парсинга xml или строк.
Я не могу вспомнить, где я первоначально нашел этот код.Я думал, что это могло быть на этом сайте, но при поиске я не смог его найти.Поэтому, если кто-то найдет его, я с радостью отдаю должное тому, кому он принадлежит.Просто хотел поделиться, потому что я не был знаком с этим в 2008 году и чувствовал, что это был очень чистый подход.