Nie możesz wyszukać danej nazwy, pomimo że prawidłowo wprowadzasz jej wartość? Po raz kolejny natrafiasz na krzaczki, kwadraty lub nie widoczne białe znaki w tekstach? Czas najwyższy by wprowadzić obsługę tychże nikczemnych znaków i pozbyć się niezręcznych sytuacji.
Problemem tutaj są znaki specjalne, które często nie są widoczne na pierwszy rzut oka. Często pojawiają się przez kopiowanie treści ze stron internetowych, zwłaszcza zagranicznych, gdzie używane są inne zestawy znaków i kodowania. Jednym z taki przypadków są niewidoczne białe znaki (non-printable ASCII characters), które mogą być np. odstępem tabulatora, przejściem do nowej linii czy końcem linii.
Poniżej przedstawiam skrypt, który wykrywa we wskazanych polach znaki z listy non-printable ASCII characters:
DROP TABLE IF EXISTS #non_printable_list
DECLARE @char_id INT = 1;
CREATE TABLE #non_printable_list (
ORIGIN_VALUE NVARCHAR(300)
, FIXED_VALUE NVARCHAR(300)
, NON_PRINTABLE_CHAR NVARCHAR(15)
, COLUMN_NAME NVARCHAR(150)
)
-- obsługa znaków ASCII od 1 do 31
WHILE @char_id <= 31
BEGIN
BEGIN TRY
INSERT INTO #non_printable_list
SELECT
CUSTOMER_NAME AS CUSTOMER_NAME_ORIGIN
, REPLACE(CUSTOMER_NAME, CHAR(@char_id), '') AS CUSTOMER_NAME_FIXED
, CONCAT('CHAR(', @char_id, ')') AS NON_PRINTABLE_CHAR
, CASE WHEN CUSTOMER_NAME LIKE('%' + CHAR(@char_id) + '%') THEN 'CUSTOMER_NAME'
WHEN CITY LIKE('%' + CHAR(@char_id) + '%') THEN 'CITY'
WHEN ADDRESS LIKE('%' + CHAR(@char_id) + '%') THEN 'ADDRESS'
WHEN COUNTRY LIKE('%' + CHAR(@char_id) + '%') THEN 'COUNTRY'
ELSE 'OTHER' END AS COLUMN_NAME
FROM dbo.CUSTOMERS WITH(NOLOCK)
WHERE
CUSTOMER_NAME LIKE('%' + CHAR(@char_id) + '%')
OR CITY LIKE('%' + CHAR(@char_id) + '%')
OR ADDRESS LIKE('%' + CHAR(@char_id) + '%')
OR COUNTRY LIKE('%' + CHAR(@char_id) + '%')
SET @char_id = @char_id + 1
END TRY
BEGIN CATCH
SET @char_id = @char_id + 1
IF @char_id > 31
BEGIN
BREAK
END
END CATCH
END -- END WHILE
-- obsługa znaku 127 (delete control character)
INSERT INTO #non_printable_list
SELECT
CUSTOMER_NAME AS CUSTOMER_NAME_ORIGIN
, REPLACE(CUSTOMER_NAME, CHAR(127), '') AS CUSTOMER_NAME_FIXED
, CONCAT('CHAR(', 127, ')') AS NON_PRINTABLE_CHAR
, CASE WHEN CUSTOMER_NAME LIKE('%' + CHAR(127) + '%') THEN 'CUSTOMER_NAME'
WHEN CITY LIKE('%' + CHAR(127) + '%') THEN 'CITY'
WHEN ADDRESS LIKE('%' + CHAR(127) + '%') THEN 'ADDRESS'
WHEN COUNTRY LIKE('%' + CHAR(127) + '%') THEN 'COUNTRY'
ELSE 'OTHER' END AS COLUMN_NAME
FROM dbo.CUSTOMERS WITH(NOLOCK)
WHERE
CUSTOMER_NAME LIKE('%' + CHAR(127) + '%')
OR CITY LIKE('%' + CHAR(127) + '%')
OR ADDRESS LIKE('%' + CHAR(127) + '%')
OR COUNTRY LIKE('%' + CHAR(127) + '%')
SELECT * FROM #non_printable_list