Можно ли отправить набор идентификаторов в качестве параметра SQL ADO.NET?

Например. могу я написать что-то вроде этого кода:

public void InactiveCustomers(IEnumerable<Guid> customerIDs)
{
    //...
    myAdoCommand.CommandText =
        "UPDATE Customer SET Active = 0 WHERE CustomerID in (@CustomerIDs)";
    myAdoCommand.Parameters["@CustomerIDs"].Value = customerIDs;
    //...
}

Единственный известный мне способ - это присоединиться к моему IEnumerable, а затем использовать конкатенацию строк для построения моей строки SQL.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
20
0
7 905
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Неа. Параметры подобны значениям 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, просто чтобы снова представить их обратно в БД ????? Они уже там! Я что-то упускаю?

Проголосовали против самого первого утверждения в вашем ответе, что в целом неверно. Я согласен с предложениями в конце вашего вопроса, хотя ... в некоторых случаях мог бы действительно может делать все в БД, поэтому проблема передачи списков может вообще никогда не возникнуть.

stakx - no longer contributing 29.06.2015 10:34
Ответ принят как подходящий

Обычно это делается путем передачи списка значений, разделенных запятыми, и внутри хранимой процедуры, синтаксического анализа списка и вставки его во временную таблицу, которую затем можно использовать для объединений. Начиная с SQL Server 2005, это стандартная практика для работы с параметрами, которые должны содержать массивы.

Вот хорошая статья о различных способах решения этой проблемы:

Передача списка / массива в хранимую процедуру SQL Server

Но для SQL Server 2008 мы наконец можем передать переменные таблицы в процедуры, сначала определив таблицу как настраиваемый тип.

В этой статье есть хорошее описание этого (и других функций 2008 года):

Введение в новые возможности программирования T-SQL в SQL Server 2008

sommarskog.se/arrays-in-sql-2005.html and sommarskog.se/arrays-in-sql-2000.html are the reference read on this topic. They also discuss the pros and cons in much more detail than the Vyas's one.
Remus Rusanu 01.08.2009 05:26

Существует также более новая версия статей Э. Соммарскога по SQL Server 2008 (в которой основное внимание уделяется параметрам с табличными значениями): sommarskog.se/arrays-in-sql-2008.html. Я думаю, что комментарий @ RemusRusanu заслуживает отдельного ответа; Выложил такую: stackoverflow.com/a/31110710/240733

stakx - no longer contributing 29.06.2015 11:09

Можно с 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

http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx

Как уже упоминалось в комментарии, Эрланд Соммарског написал серию статей по этой теме (ссылка на которую приведена ниже). Статьи очень подробны и могут служить справочным материалом. Хотя они специфичны для SQL Server (T-SQL), некоторые из упомянутых методов могут также работать для других СУБД (например, с использованием типа данных XML):

Другие вопросы по теме