ASP.net простой запрос на удаление, передайте строковое значение - PullRequest
1 голос
/ 10 марта 2011
DELETE FROM tblArtworkApprovalUsers
WHERE     (userID NOT IN (@UserIDList)) AND (approvalID =
                          (SELECT     ID
                            FROM          tblArtworkApprovals
                            WHERE      (templateID = @TemplateID)))

Это у меня на столе адаптер.@UserIDList должен принимать что-то вроде:

2,44,12,70

Как я могу заставить этот запрос принимать эту строку?

Ответы [ 3 ]

2 голосов
/ 10 марта 2011

NOT IN <expr> требует выражения, а не строки.Поэтому, если вы передаете параметр и не создаете SQL динамически, это не может быть сделано.

Альтернативой является создание SQL динамически ( при знании SQL-инъекции ):

string commad = @"DELETE FROM tblArtworkApprovalUsers " +
             "WHERE (userID NOT IN ({0})) AND (approvalID ="+
                          "(SELECT     ID " +
                            "FROM          tblArtworkApprovals " +
                            "WHERE      (templateID = {1})))";

command = string.Format(command, userIDList, templateID);

ОБНОВЛЕНИЕ

Крейг указал здесь на лучшее решение, которое не обеспечивает намного лучшую производительность (поскольку параметры являются переменными, а план запроса не кэшируется, если он не совпадает точно) но помогите с атакой внедрения SQL : Параметризация предложения SQL IN

1 голос
/ 10 марта 2011

Возможно, вы захотите взглянуть на Массивы в SQL2005 и Массивы в SQL2008 , в зависимости от версии вашего сервера SQL.

1 голос
/ 10 марта 2011

У вас есть несколько вариантов ...

  1. Динамически создайте всю строку SQL и выполните ее (как рекомендует Алиостад).
  2. Напишите хранимую процедуру, которая принимает строку, анализирует ее во временной таблице, а затем запускает запрос к этой временной таблице. Быстрый поиск предоставит много способов сделать это ( здесь - один).
...