Before I go on, let me say that I understand the whole idea of "printable" is dependant on what you mean by "print". For simplicity, I am defining "printable" as anything in the base ASCII set (<128) that will actually display in the standard SQL Management Studio query results. Therefore, everything else is "non-printable". I realize there may be an exception or two, so I made sure to write code that was easily modifiable to include exceptions.
I first tried PATINDEX, but the pseudo-regex patterns can return somE wacky results, based on which default collation is being used. It would also make the code harder to read and modify for someone not familiar with the PATINDEX flavor of regex.
So, here it is. It is not the most efficient way, but certainly adequete, while being easy to modify.
DECLARE @I INT,
@TEST VARCHAR(100)
SELECT @TEST='123' + CHAR(13) + '412' + CHAR(200) + '341', --testing string
@I=0 --start at zero
WHILE @I<256 --check entire extended ascii set
BEGIN
IF @I=33 SELECT @I=127 --this jumps over the range that I want to keep
SELECT @TEST=REPLACE(@TEST, CHAR(@I), ' ') --this replaces the current char with a space
SELECT @I=@I+1
END
SELECT @TEST
Another way to do this which allows better granular control over which characters you allow is this:
DECLARE @GOOD VARCHAR(256),
@TEST VARCHAR(100),
@I INT
SELECT @GOOD='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()-_=+/?.>,<;:|~ ' + char(13) + char(10) + char(9)
SELECT @TEST='123' + CHAR(13) + '412' + CHAR(200) + '341', --testing string
@I=0
SELECT @TEST
WHILE @I
IF PATINDEX('%' + SUBSTRING(@TEST,@I,1) + '%',@GOOD)=0
BEGIN
SELECT @TEST=REPLACE(@TEST,SUBSTRING(@TEST,@I,1),' ')
END
SELECT @I=@I+1
END
SELECT @TEST
Did this help you? If so, please leave a comment!
No comments:
Post a Comment