Overview
Η καταχώρηση δεδομένων σε μία εφαρμογή πάντα πρέπει να περιλαμβάνει κανόνες για να εξασφαλιστεί η ποιότητα των δεδομένων και η σωστή μελλοντική επεξεργασία τους.
Οι χρήστες πάντα βρίσκουν τρόπους για να κάνουν την ζωή τους καλύτερη κατά την εισαγωγή δεδομένων. Η άποψη μου είναι ότι καλά κάνουν.
Ένας χρήστης μπορεί να εισάγει δεδομένα εκτός από την πληκτρολόγηση, με copy & paste, με import κ.α.
Ιδιαίτερη προσοχή θέλουν δύο περιπτώσεις. Η πρώτη είναι το copy-paste πχ από word/excel και η δεύτερη περίπτωση να υπάρχει δυνατότητα πληκτρολόγησης κειμένου μέσα στην εφαρμογή όπου μπορεί να πατήσει enter για αλλαγή γραμμής.
Σε αυτές τις περιπτώσεις συνήθως καταχωρούνται και οι χαρακτήρες που δεν φαίνονται όπως το CR/LF και άλλοι.
Τέτοιοι χαρακτήρες είναι γνωστοί σαν non printable characters και είναι γνωστοί από το ASCII table. Αυτοί οι χαρακτήρες είναι από το 0 - 31 (βλέπε την παρακάτω εικόνα).
The problem
Συνήθως δεν υπάρχει πρόβλημα στην εφαρμογή γιατί έχει προβλεφθεί σε αυτή αυτό (τουλάχιστον στις περισσότερες).
Το πρόβλημα όμως είναι όταν τα δεδομένα αυτά πρέπει να χρησιμοποιηθούν σε DW, Analytics κλπ. Σε αυτές τις περιπτώσεις πρέπει να γίνει data cleansing που να βγάζει τους χαρακτήρες αυτούς καθώς αν δεν γίνει προκύπτουν προβλήματα εκτέλεσης σε SSIS,ADF αλλά και στην ανάγνωση τους από εργαλεία όπως Power BI, Excel Power Pivot κλπ.
Φυσικά μπορεί να χρησμοποιηθεί και για άλλους σκοπούς που χρειάζονται την συγκεκριμένη λειτουργικότητα.
My Solution
Επειδή δεν υπάρχει κάτι συγκεκριμένο το οποίο να παρέχει την συγκεκριμένη λειτουργικότητα ο καθένας έχει φτιάξει την δικιά του. Η προσωπική μου εκδοχή είναι η παρακάτω που έχει δοκιμαστεί σκληρά όλα αυτά τα χρόνια και αποδίδει αρκετά ικανοποιητικά.
Έχω δύο εκδοχές για non-Unicode και για Unicode string.
Και στις δύο περιπτώσεις επειδή η χρήση loop ανά χαρακτήρα είναι αργή έχω κάνει χρήση της REPLACE των χαρακτήρων αυτών σε space χαρακτήρα.
SQL Script
CREATE OR ALTER FUNCTION dbo.RemoveNonPrintChars ( @str VARCHAR(MAX) )
RETURNS VARCHAR(MAX) AS
BEGIN
SELECT @str=REPLACE(@str,C,' ')
FROM
(
SELECT TOP(32) CHAR(CN) AS C
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY N1.N) - 1 AS CN
FROM (VALUES(1),(1),(1),(1),(1),(1)) AS N1(N)
CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1)) AS N2(N)
) AS C
) AS R
RETURN @str
END
GO
CREATE OR ALTER FUNCTION dbo.RemoveNonPrintCharsUnicode ( @str NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX) AS
BEGIN
SELECT @str=REPLACE(@str,C,' ')
FROM
(
SELECT TOP(32) CHAR(CN) AS C
FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY N1.N) - 1 AS CN
FROM (VALUES(1),(1),(1),(1),(1),(1)) AS N1(N)
CROSS JOIN (VALUES(1),(1),(1),(1),(1),(1)) AS N2(N)
) AS C
) AS R
RETURN @str
END
GO
Antonios Chatzipavlis