Есть два способа сделать то, что вы хотите сделать здесь.Один из них - создать динамический SQL-запрос и выполнить его после замены в списке IN.
DECLARE @query varchar(max);
SET @query = 'SELECT * FROM Nav WHERE CONVERT(VARCHAR,NavigationID) IN (' + @Ids + ')'
exec (@query)
Это может повлиять на производительность и привести к другим сложностям.Обычно я стараюсь избегать этого.
Другой метод заключается в использовании пользовательской функции (UDF), чтобы разбить строку на составные части и затем выполнить запрос.Здесь есть сообщение о том, как создать эту функцию здесь
Как только функция существует, присоединиться к ней тривиально
SELECT * FROM Nav
CROSS APPLY dbo.StringSplit(@Ids) a
WHERE a.s = CONVERT(varchar, Nav.NavigationId)
NB - ссылка на поле 'as'основан на связанной функции, которая хранит значение разделения в столбце с именем 's'.Это может отличаться в зависимости от реализации вашей функции разделения строк
Это хорошо, потому что он использует подход на основе множеств к запросу, а не подзапрос IN, но CROSS JOIN может быть немного сложным на данный момент,поэтому, если вы хотите сохранить синтаксис IN, должно работать следующее:
SELECT * FROM Nav
WHERE Nav.NavigationId IN
(SELECT CONVERT(int, a.s) AS Value
FROM dbo.StringSplit(@Ids) a