Как поиск в 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.
Вы, кажется, неправильно указали одинарные кавычки ('
). Это (скопировано с вашего 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?%'