Например. могу я написать что-то вроде этого кода:
public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
//...
myAdoCommand.CommandText =
"UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
//...
}
Единственный известный мне способ - это присоединиться к моему IEnumerable, а затем использовать конкатенацию строк для построения моей строки SQL.





Неа. Параметры подобны значениям SQL в соответствии с первая нормальная форма, в основном, может быть только один ...
Как вы, вероятно, знаете, создание строк SQL - рискованное дело: вы оставляете себя открытым для Атака с использованием SQL-инъекции. Пока вы имеете дело с добросовестными GUID, все будет в порядке, но в противном случае вам нужно обязательно очистить свой ввод.
Вы не можете передать список как один параметр SQl. Вы можете выполнить string.Join (',') GUIDS, например «0000-0000-0000-0000, 1111-1111-1111-1111», но это будет связано с большими накладными расходами базы данных и на самом деле неоптимально. И вы должны передать всю строку как один конкатенированный динамический оператор, вы не можете добавить его в качестве параметра.
Вопрос:
Откуда вы берете список идентификаторов неактивных клиентов?
Я предлагаю подойти к проблеме несколько иначе. Переместите всю эту логику в базу данных, например:
Create procedure usp_DeactivateCustomers
@inactive varchar(50) /*or whatever values are required to identify inactive customers*/
AS
UPDATE Customer SET c.Active = 0
FROM Customer c JOIN tableB b ON c.CustomerID = b.CustomerID
WHERE b.someField = @inactive
И назовите это хранимой процедурой:
public void InactiveCustomers(string inactive)
{
//...
myAdoCommand.CommandText =
"usp_DeactivateCustomers";
myAdoCommand.Parameters["@inactive"].Value = inactive;
//...
}
Если список GUID существует в базе данных, зачем мне их искать; поместите их в общий список; развернуть список в переменную CSV / XML / Table, просто чтобы снова представить их обратно в БД ????? Они уже там! Я что-то упускаю?
Обычно это делается путем передачи списка значений, разделенных запятыми, и внутри хранимой процедуры, синтаксического анализа списка и вставки его во временную таблицу, которую затем можно использовать для объединений. Начиная с SQL Server 2005, это стандартная практика для работы с параметрами, которые должны содержать массивы.
Вот хорошая статья о различных способах решения этой проблемы:
Передача списка / массива в хранимую процедуру SQL Server
Но для SQL Server 2008 мы наконец можем передать переменные таблицы в процедуры, сначала определив таблицу как настраиваемый тип.
В этой статье есть хорошее описание этого (и других функций 2008 года):
Введение в новые возможности программирования T-SQL в SQL Server 2008
Существует также более новая версия статей Э. Соммарскога по SQL Server 2008 (в которой основное внимание уделяется параметрам с табличными значениями): sommarskog.se/arrays-in-sql-2008.html. Я думаю, что комментарий @ RemusRusanu заслуживает отдельного ответа; Выложил такую: stackoverflow.com/a/31110710/240733
Можно с SQL 2008. Он вышел не очень давно, но есть в наличии.
Вы можете использовать тип параметра xml:
CREATE PROCEDURE SelectByIdList(@productIds xml) AS
DECLARE @Products TABLE (ID int)
INSERT INTO @Products (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @productIds.nodes('/Products/id') as ParamValues(ID)
SELECT * FROM
Products
INNER JOIN
@Products p
ON Products.ProductID = p.ID
Как уже упоминалось в комментарии, Эрланд Соммарског написал серию статей по этой теме (ссылка на которую приведена ниже). Статьи очень подробны и могут служить справочным материалом. Хотя они специфичны для SQL Server (T-SQL), некоторые из упомянутых методов могут также работать для других СУБД (например, с использованием типа данных XML):
Массивы и списки в SQL Server 2008 с использованием табличных параметров:
Массивы и списки в SQL Server 2005 и последующих версиях, когда TVP их не сокращают:
Проголосовали против самого первого утверждения в вашем ответе, что в целом неверно. Я согласен с предложениями в конце вашего вопроса, хотя ... в некоторых случаях мог бы действительно может делать все в БД, поэтому проблема передачи списков может вообще никогда не возникнуть.