Как поиск в execute_sql не работает должным образом

Я сталкиваюсь с очень странным поведением подобного поиска в sp_executesql:

Этот оператор возвращает 0 строк:

exec sp_executesql N'SELECT * FROM MyTable WHERE Name LIKE ''%'' +
     @Name + ''%''',N'@Name nvarchar(7)',@Name=N'100024​'

Когда этот эквивалент возвращает желаемую строку:

DECLARE @Name nvarchar(7)=N'100024'    
SELECT * FROM MyTable WHERE Name LIKE '%' + @Name + '%'

Что не так с командой exec sp_executesql? если я использую его для поиска в другой строке, такой как "100033", он находит строку, поэтому синтаксис должен быть в порядке (на самом деле запрос был взят из SQL Profiler при попытке отладки, почему моя страница asp.net не нашла этот конкретный элемент)

3 ответа

Решение

У вас есть странные символы Юникода в N'100024​' часть. Попробуйте удалить часть N'100024​' и напиши это заново.

Пример - первая строка работает нормально, вторая строка не работает:

exec sp_executesql N'SELECT * FROM #MyTable WHERE Name LIKE ''%''+@Name+''%''', N'@Name nvarchar(200)',@Name=N'100024'
exec sp_executesql N'SELECT * FROM #MyTable WHERE Name LIKE ''%''+@Name+''%''', N'@Name nvarchar(200)',@Name=N'100024​'

Попробуйте сохранить запрос в SQL Management Studio, а затем откройте его, и вы увидите символы вроде: @Name=N'100024‚Äč', Он подскажет вам, если вы хотите сохранить в Unicode.

У вас есть невидимый символ здесь @Name=N'100024​'

Вы, кажется, неправильно указали одинарные кавычки ('). Это (скопировано с вашего sp_execute немного):

DECLARE @Name nvarchar(7);
SET @Name = '100024​'
PRINT 'SELECT * FROM MyTable WHERE Name LIKE ''%'' +      @Name + ''%'''

выводит это:

SELECT * FROM MyTable WHERE Name LIKE '%' +      @Name + '%'

Попробуйте удалить одну цитату до и после @name:

'SELECT * FROM MyTable WHERE Name LIKE ''%' +      @Name + '%'''

Выход:

SELECT * FROM MyTable WHERE Name LIKE '%100024?%'
Другие вопросы по тегам