2014-11-04 5 views
-1

Я столкнулся с очень странным поведением, как поиск в sp_executesql:Как поиск в execute_sql не работает должным образом - SQL Server

Это утверждение возвращает 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 не нашла этот конкретный элемент)

ответ

0

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

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

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

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

0

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

Вы невидимого символа здесь, @Name=N'100024​'

enter image description here

+0

Хорошая работа, хороший экземпляр! –

+0

Я думал то же самое о вас - спасибо! :) –

+0

Да, не нужно спорить, этот вопрос должен быть закрыт в любом случае как простая опечатка. –