我们最近从sql Server 2012迁移到sql Server 2014,并且我们所有的FOR
XML代码都开始抛出有关不可打印的ASCII字符的错误.
我写了这个可怕的函数来删除不可打印的ASCII字符作为快速修复.我想用更干净的东西代替它.有没有办法做到这一点?
我写了这个可怕的函数来删除不可打印的ASCII字符作为快速修复.我想用更干净的东西代替它.有没有办法做到这一点?
ALTER FUNCTION [dbo].[remove_non_printable_chars] (@input_string nvarchar(max)) RETURNS nvarchar(max) BEGIN RETURN REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(@input_string,CHAR(1),''),CHAR(2),CHAR(3),CHAR(4),CHAR(5),CHAR(6),CHAR(7),CHAR(8),CHAR(9),CHAR(10),CHAR(11),CHAR(12),CHAR(13),CHAR(14),CHAR(15),CHAR(16),CHAR(17),CHAR(18),CHAR(19),CHAR(20),CHAR(21),CHAR(22),CHAR(23),CHAR(24),CHAR(25),CHAR(26),CHAR(27),CHAR(28),CHAR(29),CHAR(30),CHAR(31),NCHAR(0) COLLATE Latin1_General_100_BIN2,'') END
这是打破的FOR XML代码. (我没有写这个.它已经在代码库中了).
SELECT @HTMLTableData = ( SELECT HTMLRows FROM ( SELECT N'<tr>' + HTMLRow + N'</tr>' AS HTMLRows FROM @HTMLRowData ) mi FOR XML PATH(''),TYPE ).value('/','NVARCHAR(MAX)')
解决方法
另外一个选项.
此功能将替换控制字符并更正任何残留的重复空格.例如,简·史密斯{13}在这里将不会像简史密斯在这里那样被归还,而是珍·史密斯在这里
CREATE FUNCTION [dbo].[udf-Str-Strip-Control](@S varchar(max)) Returns varchar(max) Begin ;with cte1(N) As (Select 1 From (Values(1),(1),(1)) N(N)),cte2(C) As (Select Top (32) Char(Row_Number() over (Order By (Select NULL))-1) From cte1 a,cte1 b) Select @S = Replace(@S,C,' ') From cte2 Return ltrim(rtrim(replace(replace(replace(@S,' ','†‡'),'‡†','†‡',' '))) End --Select [dbo].[udf-Str-Strip-Control]('Michael '+char(13)+char(10)+'LastName') --Returns: Michael LastName