Передача параметра оператору SQL select IN действует странно.

У меня есть следующий запрос, который возвращает 2 записи (в построителе запросов DataSet)

SELECT        EmpID, Name, id
FROM          Users
WHERE        (CAST(id AS Varchar(20)) IN ('5688','5689'))

Теперь, если я сделаю тот же запрос, передав параметр вместо кода: String param = "'5688','5689'"; он возвращает ноль.

WHERE        (CAST(id AS Varchar(20)) IN (@param))

Я попытался снять самый первый и последний ', но это не изменило ситуацию.

!!!id - это уникальный ПК!!!

Кто-нибудь знает?


person Jake    schedule 29.04.2012    source источник
comment
Не могли бы вы опубликовать код, содержащий указанные параметры?   -  person Lion    schedule 29.04.2012


Ответы (4)


Решение, которое я нашел, довольно простое, оно работает как шарм, и нет необходимости в sps или других функциях;

SQL:

SELECT whatever 
FROM whatever
WHERE (PATINDEX('%''' + CAST(id AS Varchar(20)) + '''%', @param) > 0)

C#:

String param = "'''1234'',''4567'''";
dataTable1 = tableAdapter1.getYourValues(param);
person Jake    schedule 30.04.2012
comment
Вот довольно подробное обсуждение способов сделать это. stackoverflow.com/questions/337704/ - person Mark Brackett; 30.04.2012
comment
Это как раз то, что мне было нужно. Мой разработчик наборов данных продолжал по умолчанию использовать для моего параметра значение DbType = Object, что не понравилось SQL, поэтому мне пришлось обновить параметр до DbType = String, но тогда это сработало как шарм. - person Cory; 07.07.2017

Переменная не разрешена в предложении IN.
Вы ожидаете, что значения будут представлены в виде строки с разделителями-запятыми, и вы можете использовать функцию разделения (определяемую пользователем и нестандартную), чтобы соединить их с исходными таблицами:

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=326300&SiteID=1

Для получения дополнительной информации посетите страницу . это

person jams    schedule 29.04.2012

('5688','5689') — это массив значений.

Определение String param = "'5688','5689'"; и использование его как (@param) делает ('5688','5689') строкой. Что не сработает.

person Bibhas Debnath    schedule 29.04.2012

Бибхас прав. Для меня это сработало:

string param="'1234','4567'"; мы не можем использовать param как параметр SQL(@param).

command = new SqlCommand("SELECT * FROM table WHERE number IN (" + param + ")", connection);

command.ExcecuteReader();

person Praveen    schedule 19.03.2013
comment
Вы добавляете свои значения непосредственно в SQL, но мы пытаемся передавать значения по параметрам. На мой взгляд, ваш SQL может быть инъекционным. - person Yasin Yörük; 18.06.2015