Jaki jest najlepszy sposób sprawdzenia, czy pole VARCHAR zawiera postacie inne niż ascii?
CHAR(1)
poprzez CHAR(31)
i CHAR(127)
dzięki CHAR(255)
.
Próbowałem użyć PATINDEX
i napotkałem następujący problem.
Sprawdzanie dolnego zakresu działało poprawnie.
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Moje dane miały trzy rekordy z 0x1E i wszystkie trzy zostały zwrócone.
Ale kiedy sprawdzę tylko górny zakres:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Zwraca prawie wszystkie rekordy w tabeli (tabela 170737 i 170735), a ponieważ moje dane nie miały żadnych wartości w tym zakresie, pomyślałbym, że nie powinny zwracać żadnych rekordów.
sql-server
sql-server-2008-r2
t-sql
Gerhard Weiss
źródło
źródło
Odpowiedzi:
Zakresy w składni wzorca używają reguł sortowania sortowania.
Użyj binarnej klauzuli sortowania, aby zakres był uporządkowany według kodu znakowego.
(Zmieniłem to również,
LIKE
ponieważ uważam to za bardziej oczywiste niżPATINDEX > 0
)źródło
Jeśli jesteś podobny do mnie i zmęczyłeś się przez lata szukaniem tych znaków w okropnych danych Twojej firmy, możesz użyć tej funkcji lub przepisać ją do własnych celów. To wprawdzie trudne, ale stanowi dodatkowy krok w identyfikacji znaków specjalnych, jeśli chcesz - komentują to linie od 19 do 179.
Jeśli ciąg nie zawiera niedrukowalnych lub rozszerzonych wartości ascii - zwraca NULL.
A potem nazwij to tak:
Przykładowe dane wyjściowe:
Lub
źródło