• Unfortunately, converting to varbinary didn't work and neither did removing the nchar(0) start.

    Also unfortunately, I do not have permission to run profiler in this particular case. It's a severely locked down server.

    I have confirmed that the '?' I am seeing is truly CHAR(63) by checking the ASCII value of the characters in the field.

    Now, to explain further, I have this code in a Function on another server. It works flawlessly there. I pass in a NVARCHAR(MAX) string and it runs through all the chars and uses STUFF to take them out. It spits out the cleaned string.

    I can't simply put the working function on this server and handle it the same way. I am not allowed to create anything more than temp tables. As a result, I am using SSIS. Here is the run-down on what I am doing:

    First thing I do is identify ALL char, varchar, nchar, and nvarchar columns in the TABLE_SCHEMA.

    I have a ForEach loop to iterate over all of these identified tables/columns. In the loop I do a couple of things:

    First, I create a SQL statement using VBScript. It outputs two variables; SQL1 and SQL2. They are:

    --sTable and sColumn are pulled in from the ForEach loop

    SQL1 = "SELECT * FROM " & sTable & " WHERE PATINDEX("

    SQL2 = ", (" & sColumn & ") COLLATE Latin1_General_BIN) <> 0"

    Next, I run the SQL code from my first post. Here is the unaltered code in that SQL Task:

    DECLARE @Counter INTEGER

    DECLARE @Pattern NVARCHAR(MAX)

    DECLARE @loop int

    DECLARE @sSQL NVARCHAR(MAX)

    SET @Pattern = '%['

    SET @Pattern = @Pattern + NCHAR(0) + NCHAR(1) + NCHAR(2) + NCHAR(3) + NCHAR(4) + NCHAR (5) + NCHAR(6) + NCHAR(7) + NCHAR(8) + NCHAR(11) + NCHAR(12) + NCHAR(14) + NCHAR(15) + NCHAR(16) + NCHAR(17) + NCHAR(18) + NCHAR(19) + NCHAR(20) + NCHAR(21) + NCHAR(22) + NCHAR(23) + NCHAR(24) + NCHAR(25) + NCHAR(26) + NCHAR(27) + NCHAR(28) + NCHAR(29) + NCHAR(30) + NCHAR(31)

    SET @loop = 55296

    WHILE @loop < 57344

    BEGIN

    SET @Pattern = @Pattern + NCHAR (@loop)

    SET @loop = @loop + 1

    END

    SET @Pattern = @Pattern + NCHAR(65534) + NCHAR(65535)

    SET @Pattern = @Pattern + ']%'

    SET @sSQL = ? + '''' + @Pattern + '''' + ?

    EXEC (@sSQL)

    After this step, I do some logging and such that isn't important to this question, so I'll stop it there.

    Now, the reason why I am using the VBScript to create SQL1 and SQL2 is because I cannot include @Pattern in dynamic SQL. (Must declare the scalar variable "@Pattern".) I have to use dynamic SQL because I am changing the table and/or column each time as I iterate over my list.

    I am open to any other suggestions or different approaches. I've been scratching my head over this for a couple of weeks now.