2010-02-02 1 views
4

Моя конечная цель - написать sql-скрипт, который выбирает данные из конкретной таблицы, где столбец nvarchar (max) содержит символ NCHAR (2028).Напишите запрос T-SQL, который фильтрует записи, содержащие NCHAR (2028)

Но очевидно:

select * 
from tablename 
where columnname like '%' + NCHAR(2028) + '%' 

возвращает все строки.

+0

Каков тип данных столбца? –

+0

Тип данных nvarchar (128) –

ответ

4

Использование бинарных сортировок для сравнения, как.

select * 
from tablename 
where columnname COLLATE Latin1_General_Bin like '%' + NCHAR(2028) + '%' 
+0

Спасибо G Mastros. –

+0

Правильно, это работает – SQLMenace

1

Я думаю, что вы нажимаете ограничения на символы, которые находятся за пределами вашей сортировки. У меня было какое-то странное поведение. Обратите внимание, что результат двух операторов SELECT здесь:

CREATE TABLE dbo.foo 
(
    id INT IDENTITY(1,1), 
    bar NVARCHAR(128) 
); 

INSERT dbo.foo(bar) SELECT N'foobar' 
UNION 
SELECT N'foo' + NCHAR(2028) + N'bar' 

SELECT * 
    FROM dbo.foo 
    WHERE bar LIKE N'%' + NCHAR(2028) + '%'; 

TRUNCATE TABLE dbo.foo; 

INSERT dbo.foo(bar) 
SELECT N'foo' + NCHAR(2028) + N'bar' 

SELECT * 
    FROM dbo.foo 
    WHERE bar LIKE N'%' + NCHAR(2028) + '%'; 

DROP TABLE dbo.foo; 

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

К сожалению, при вставке фактического значения NCHAR (2028) в SSMS не работает, поскольку он не находится в наборе поддерживаемых символов (я получаю глиф, как поле вопросительного знака в Super Mario Brothers). В противном случае я бы просто предложить:

WHERE columnname LIKE N'%߬%'; 

Если вы можете сделать это из вашего кода (и не беспокоиться о SSMS), это может быть работоспособной альтернативой.

+0

PS Я понимаю, что моя последняя строка кода показывает акцент nina или что-то еще, что может и не быть тем, что вы ожидаете. Представьте себе, что вы ввели в свой код фактическое представление персонажа NCHAR (2028) и выясните, помогает ли оно разрешить его со стороны приложения. –

+0

Вот почему каждый должен учиться и использовать только Эсперанто, и мы уничтожим все подобные вещи. – SQLMenace

+0

Я в середине переваривания этого комментария. Я заметил, что первый UNION не был UNION ALL, поэтому вставлен один ряд. (Как-то UNION определил обе строки одинаковыми) –

2

Это работает

CREATE TABLE #temp (columnname NVARCHAR(128)) 

INSERT #temp VALUES ('a') 
INSERT #temp VALUES (NCHAR(2028)) 
INSERT #temp VALUES ('b') 
INSERT #temp VALUES ('c' + NCHAR(2028) + 'c') 
INSERT #temp VALUES ('a' + NCHAR(2028) + 'b') 





SELECT * 
FROM #temp 
WHERE ColumnName COLLATE Latin1_General_Bin Like N'%' + NCHAR(2028) + '%' 

drop table #temp 
+0

Проверьте порядок аргументов, не должен выглядеть ваш последний запрос: CHARINDEX (NCHAR (2028), columnname) –

+0

исправлено ... Я думаю, что «%» отбрасывает его ... может быть, RegEx не может справиться с этими символы ... – SQLMenace

+0

Это должно работать – SQLMenace