Как использовать `sp_executesql` с« like »и« parameter »? - PullRequest
0 голосов
/ 30 ноября 2018

Я не могу заставить sp_executesql работать с очень простым оператором.

Когда я делаю это

select * from vwChassisHistory t where t.ChassisNumber like '%1234%' 

, он перенастраивает 214 строк, как я ожидаю

Но когда я делаю это

exec sp_executesql 
  N'select * from vwChassisHistory t where t.ChassisNumber like ''%@ChassisNumber%'' ',
  N'@ChassisNumber varchar(4)',@ChassisNumber='1234'

, он возвращает 0ряды

Так что я, должно быть, делаю здесь очень глупую ошибку, но я просто не вижу ее.
Как использовать sp_executesql с like и parameter?

Я смотрю на это , но этот вопрос касается динамического построения утверждения, поэтому оно мне не помогает
Также это не дает мне ответа

РЕДАКТИРОВАТЬ
Чтобы получить SqlCommand для создания sql, как в принятом ответе, мне пришлось изменить код с этого

string chassisNumber = "1234";

string sql = "select * from vwChassisHistory t ";
string where += "where t.ChassisNumber like '%@ChassisNumber%' ";

на этот

string where = "where t.ChassisNumber like '%' + @ChassisNumber + '%' ";

1 Ответ

0 голосов
/ 30 ноября 2018

Вам необходимо разделить символы @parameter и %:

exec sp_executesql 
  N'SELECT * FROM vwChassisHistory t WHERE (t.ChassisNumber like ''%'' + @ChassisNumber + ''%'')',
  --                                                                   ^                ^
  -- ------------------------------------------------------------------+                |
  -- -----------------------------------------------------------------------------------+
  N'@ChassisNumber VARCHAR(4)', @ChassisNumber = '1234'

В исходном запросе имя параметра становится частью строкового литерала, и SQL Server завершает поиск подстроки @ChassisNumber:

SELECT * FROM vwChassisHistory t WHERE t.ChassisNumber LIKE '%@ChassisNumber%'

Пересмотренный запрос выполняется следующим образом:

SELECT * FROM vwChassisHistory t WHERE t.ChassisNumber LIKE '%' + @ChassisNumber + '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...