2015-03-08 3 views
0

Я пытаюсь создать DELETE заявление, в котором я буду удалять некоторые элементы из таблицы на основе списка идентификаторов, используя IN пункт:Ошибка преобразования типа данных VARCHAR в BigInt - В статье

DELETE FROM table WHERE id IN (@ids) 

Использование SqlCommand, я делаю следующее, чтобы создать IN параметр:

public void DeleteItemsByIds(int[] ids) { 

    Parameters["ids"] = string.Join(", ", ids); 
    ExecuteNonQuery(deleteStatement, Parameters); 
} 

Тогда я получаю сообщение об ошибке:

Error converting data type varchar to bigint

Кто-то знает, как я могу его решить?

Спасибо всем!

+1

Ну, 'IN' ожидает ** список (предположительно) значений' BIGINT' **, в то время как то, что вы предоставляете, на самом деле является просто ** одной строкой ** ..... Для SQL Server * * 2008 ** и новее, проверьте ** табличные параметры **, чтобы передать несколько значений в оператор SQL –

+0

Построить всю инструкцию SQL как текст, а не только набор включений, и это должно работать. –

+1

@PieterGeerkens: это ** ужасный ** совет, поскольку он открывает возможность ** SQL-инъекций ** атак ... серьезно - не делайте этого! –

ответ

1

in ожидает список вещей, типы которых слева и справа совместимы. Ясно, что левая сторона in является числовой, а правая сторона - строкой. И вы не можете преобразовать строку в число, потому что это список с разделителями-запятыми.

Быстрый и грязный раствор просто использовать like:

DELETE 
    FROM table 
    WHERE ',' + @ids + ',' LIKE '%,' + CAST(id as VARCHAR(255)) + ',%'; 

Однако, это не является оптимальным с точки зрения производительности, так как он не может использовать индекс на id. Лучшие решения, требующие больше узнать о приложении, использующем SQL.

Смежные вопросы